每日题解:LeetCode 128. 最长连续序列

本文介绍了一种使用HashSet解决最长连续序列问题的方法,通过一次遍历和判断元素是否为序列起始点,实现了时间复杂度为O(n)的高效算法。

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

题目地址
个人博客地址

题目描述

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。

解法

JAVA

class Solution {
    public int longestConsecutive(int[] nums) {
Set<Integer> set=new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }
        int res=0;
        for (int num : set) {
            if(!set.contains(num-1)){
                int temp=0;
                for (int tempNum =num; set.contains(tempNum); tempNum++) {
                    temp++;
                }
                res = Math.max(res, temp);
            }
        }
       return res;
    }
}

解题思路

这题目虽然是一个困难难度的题目,但是用上了set就比较简单了
假设X是最长连续序列的第一个数,我们只需要判断其 x+1, x+2,⋯ 是否存在,就可以了,判断是否存在使用set就可以了

Set<Integer> set=new HashSet<>();
for (int num : nums) {
set.add(num);
}

怎么确定当前数字就是序列的开始?
我们可以将当前数字-1,如果当前数字-1存在,那就表明当前数字在序列的中间

//左边的数不存在,表示当前数字是序列的开始
 if(!set.contains(num-1)){
 }

然后,寻找X+1,X+2

//记录个数
int temp=0;
for (int tempNum =num; set.contains(tempNum); tempNum++) {
temp++;
}

其实也可以用while,但是我觉得用for循环可以将赋值、比较、累加都能一行代码实现,就使用了for循环
寻找最大的序列

 res = Math.max(res, temp);

怎么又感觉今天又有点水题解呢?赶紧寻找我的源码练习文件夹

 // overflow-conscious code
int oldCapacity = elementData.length;
        //扩容大小在之前的数组大小的1.5
int newCapacity = oldCapacity + (oldCapacity >> 1);

这是list在扩容的时候计算个数使用的位运算,oldCapacity >> 1,获取当前数的1/2,其实可以用在二分法,计算(left+rigth)>>1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值