[leetCode 128] 最长连续序列

该博客讨论了一种解决寻找整数数组中最长连续子序列长度的方法。通过使用HashSet存储数组元素,避免重复,并通过遍历集合并检查元素的相邻数来找到连续子序列。在初始实现中,时间复杂度为O(n^2),通过优化,当遇到一个数的前一个数在集合中时,可以跳过,从而降低时间复杂度。最终给出的Java代码展示了这个优化后的解决方案。

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

解题思路

首先,用一个set来存储所有的元素,这样我们可以方便的判断某个数在不在这个数组里面。

然后,从前往后遍历这个set,针对set里面的每个元素x,我们都判断一下x+1,x+2…在不在set里面,找到以x为起点的最长子串。

然后,更新最长距离即可。这个过程的时间复杂度是O(n^2),因为我们针对每一个数,都有可能要遍历n次。

所以,我们考虑优化:针对数x,如果它是某个连续的子序列的起点,就往后遍历;如果它是某个子序列的中间的数,那么就不需要遍历了。

那么怎么判断一个数是不是某个子序列的中间数呢?只需要判断这个数的前一个数在不在集合里面就可以了,也就是看看x-1在不在,如果在,就直接跳过这个数就可以了。

代码

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (var a : nums)
            set.add(a);
        int max=0;
        for (var i : set){
            if (set.contains(i-1)) continue;
            int t=1;
            while (set.contains(++i)) t++;
            max=Math.max(t,max);
        }
        return max;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值