【LeetCode每日一练:128. 最长连续序列~~~哈希表】

文章描述了一种在给定无序整数数组中寻找最长连续序列(不考虑原数组顺序)的算法。方法是建立哈希表去重,然后遍历数组,检查每个元素后续的连续数字,利用O(n)的时间复杂度找到最长序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一个未排序的整数数组 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

求解思路

  1. 首先我们需要看一下题目给定的数据范围,我们发现如果通过暴力的方法是过不了的。
  2. 题目提示我们通过O(n)的解法来求解,我们只能通过遍历一遍,也就是一层循环来求解,那该怎么解决呢?
  3. 题目突破口,遍历给定的数组集合,判断当前元素之后的元素是否存在(当前元素+1),如果存在,那么继续判断,如果不在,中断循环,我们需要累计最大连续序列的长度。
  4. 需要注意的是,上面这个过程还有需要优化的点,当前元素的值如果从num开始,那么之后判断元素就是num+1,num+2,num+3.。。。。这些元素是否在集合中。那么,如果我们之前的元素,比如num-1的元素已经判断过的话,那么此时就不用再从num开始判断了,因为num-1到最后结束的位置一定是大于从num开始到最后结束的位置的,所以此时num-1就是最优的位置。这个也就是我们判断的一个点。

实现代码

class Solution {
    public int longestConsecutive(int[] nums) {
        // 建立一个存储所有数的哈希表,同时起到去重功能
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }
        int ans = 0;
        // 遍历去重后的所有数字
        for (int num : set) {
            int cur = num;
            // 当num-1不存在时,开始向后遍历num+1,num+2,num+3。。。
            if (!set.contains(cur - 1)) {
                while (set.contains(cur + 1)) {
                    cur++;
                }
            }
            // 求得最终的结果:cur - num + 1个
            ans = Math.max(ans, cur - num + 1);
        }
        return ans;
    }
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硕风和炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值