力扣经典150题第四十六题:最长连续序列

简介: 力扣经典150题第四十六题:最长连续序列

力扣经典150题第四十六题:最长连续序列

介绍

在本文中,我们将解决力扣经典150题中的第四十六题,该题目要求我们在未排序的整数数组中找出数字连续的最长序列的长度。我们将设计并实现时间复杂度为 O(n) 的算法解决此问题。

题目分析

给定一个未排序的整数数组 nums,我们需要找出数字连续的最长序列的长度。这意味着我们不要求序列元素在原数组中连续。

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2]

输出:4

解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]

输出:9

提示:

0 <= nums.length <= 105

-109 <= nums[i] <= 109

解题思路

我们可以使用哈希表来解决这个问题。具体来说,我们首先将数组中的所有元素放入哈希表中。然后,我们遍历数组中的每个元素,在遍历的过程中,对于每个元素,我们检查其前一个数字是否在哈希表中,如果存在,则将当前数字加入连续序列中,并继续检查下一个数字。最终,我们可以得到最长的连续序列的长度。

算法实现

import java.util.HashSet;
public class Solution {
    public int longestConsecutive(int[] nums) {
        HashSet<Integer> numSet = new HashSet<>();
        for (int num : nums) {
            numSet.add(num);
        }
        
        int longestStreak = 0;
        for (int num : numSet) {
            if (!numSet.contains(num - 1)) {
                int currentNum = num;
                int currentStreak = 1;
                
                while (numSet.contains(currentNum + 1)) {
                    currentNum++;
                    currentStreak++;
                }
                
                longestStreak = Math.max(longestStreak, currentStreak);
            }
        }
        
        return longestStreak;
    }
}

复杂度分析

  • 时间复杂度:O(n),其中n是数组的长度。我们需要遍历数组两次,一次用于填充哈希表,另一次用于计算最长序列的长度。
  • 空间复杂度:O(n),哈希表最多存储n个元素。

实例与测试

除了题目中给出的示例外,我们还可以进行更多的测试以验证算法的正确性和效率。例如:

public class Main {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums1 = {100, 4, 200, 1, 3, 2};
        int[] nums2 = {0, 3, 7, 2, 5, 8, 4, 6, 0, 1};
        
        System.out.println(solution.longestConsecutive(nums1)); // 输出:4
        System.out.println(solution.longestConsecutive(nums2)); // 输出:9
    }
}

通过这些示例测试,我们可以确保算法能够正确地处理各种情况,并在给定的时间复杂度内完成任务。

总结

在本文中,我们设计并实现了时间复杂度为 O(n) 的算法来解决最长连续序列问题。通过使用哈希表,我们可以在线性时间内解决该问题,并在题目给出的时间限制内完成计算。希望本文能对读者理解和掌握该问题的解题思路有所帮助。


这样,根据目录模板完成了关于力扣第46题的博客,让读者更好地理解和学习这道题目的解法。

相关文章
|
4月前
|
Python
【Leetcode刷题Python】376. 摆动序列
文章提供了解决LeetCode "摆动序列" 问题的Python实现代码,通过遍历整数数组并使用两个变量 down 和 up 来记录正差和负差摆动序列的长度,最终返回最长摆动子序列的长度。
43 0
|
7月前
|
存储 算法
《LeetCode》—— 摆动序列
《LeetCode》—— 摆动序列
|
7月前
|
算法 安全 测试技术
[组合数学]LeetCode:2954:统计感冒序列的数目
[组合数学]LeetCode:2954:统计感冒序列的数目
|
7月前
|
算法 测试技术 C#
【单调栈】LeetCode2030:含特定字母的最小子序列
【单调栈】LeetCode2030:含特定字母的最小子序列
|
4月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
33 6
|
4月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
26 3
|
4月前
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
31 3
|
4月前
|
算法 Python
【Leetcode刷题Python】300. 最长递增子序列
LeetCode 300题 "最长递增子序列" 的两种Python解决方案:一种使用动态规划,另一种使用贪心算法结合二分查找。
41 1
|
4月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
44 0
|
4月前
|
Python
【Leetcode刷题Python】674. 最长连续递增序列
LeetCode 674题 "最长连续递增序列" 的Python解决方案,使用动态规划算法找出给定整数数组中最长连续递增子序列的长度。
104 0