leetcode 128. Longest Consecutive Sequence

本文介绍了一种寻找整数数组中最长连续元素序列的算法,并确保时间复杂度为O(n)。该算法通过使用HashMap来存储每个元素及其对应连续序列长度的方式实现。

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

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

Your algorithm should run in O(n) complexity.

Example:

Input: [100, 4, 200, 1, 3, 2]
Output: 4
Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4.

思路:
如果能排序的话就比较简单,但是要求时间复杂度是O(n),而比较排序O(nlogn)
所以不用排序(虽然快速排序最佳是O(n))
注意最长连续子序列不包括重复元素,[4,4,5,5,6,6]的最长连续子序列长度是3, 而不是6

对每个元素,看它左边连续序列的长度和右边子序列长度
遍历每个元素,每个元素保存(key, value), 其中key是nums[i], value是在nums[i]处最长连续子序列的长度。
而nums[i]可能是以下几种情况
len代表当前元素nums[i]处最长连续子序列的长度

(1)nums[i]是最长连续子序列的右边界,如[1, 2]中的2
子序列的长度保存在左边界和右边界处,即key = nums[i] 和 nums[i - len_r] 处保存value = len, len_l指nums[i]左边的最长连续子序列长度,即看key=nums[i]-1处的value

(2)nums[i]是最长连续子序列的左边界,如[1, 2]中的1
子序列的长度保存在左边界和右边界处,即key = nums[i] 和 nums[i + len_r] 处保存value = len, len_r指nums[i]右边的最长连续子序列长度,即看key=nums[i]+1处的value

(3)nums[i]把左右子序列连接起来,如[1, 2] + 3 + [4, 5]
左边子序列的长度可以保存在2元素处,即看key=nums[i]-1处的value
右边子序列的长度可以保存在4元素处,即看key=nums[i]+1处的value
整体长度为len = len_r + len_r + 1
再更新nums[i], nums[i]-len_r, nums[i] + len_r,即更新元素本身(用来排除重复元素),左边界,右边界处的value到len
再更新整体最大值

由此可以看到需要一个HashMap保存元素和它对应的长度
对每个元素,仅需要根据它左右相邻的元素来得到左右子序列长度
每遍历一个元素,保存它自己和左右子序列边界处的元素对应的序列长度

    public int longestConsecutive(int[] nums) {
        HashMap<Integer, Integer> count = new HashMap<>();
        int maxLen = 0;
        
        for (int num : nums) {
            if (count.containsKey(num)) {
                continue;
            }
            
            int left = count.getOrDefault(num - 1, 0);
            int right = count.getOrDefault(num + 1, 0);
            int len = left + right + 1;
            
            maxLen = Math.max(maxLen, len);
            
            count.put(num, len);
            count.put(num - left, len);
            count.put(num + right, len);
        }
        
        return maxLen;
    }
### LeetCode128题 Python 解法 对于LeetCode128题——最长连续序列(Longest Consecutive Sequence),一种有效的解决方案是利用哈希表来实现。这种方法的时间复杂度为O(n)[^5]。 算法的主要思路是在遍历数组的同时,使用集合(set)存储所有的数。这样可以在常量时间内判断某个数值是否存在。为了找到最长的连续序列,针对每一个数字num,在集合中寻找num+1, num+2...直到找不到为止;同时也向负方向探索num-1, num-2...停止条件同样是遇到不存在于集合中的值。但是这种双向扩展的方式存在大量冗余计算,因为如果已经从较小的那个起点开始计算过一次完整的序列,则后续再碰到这个区间内的其他点时无需再次展开搜索。 优化后的策略是从仅从未被访问过的端点出发尝试构建可能存在的最大长度链路,并标记沿途经过的所有节点防止重复处理。具体做法如下: ```python def longestConsecutive(nums): longest_streak = 0 num_set = set(nums) for num in num_set: if num - 1 not in num_set: # 只有当当前数字是潜在序列最小值的时候才进入此逻辑 current_num = num current_streak = 1 while current_num + 1 in num_set: current_num += 1 current_streak += 1 longest_streak = max(longest_streak, current_streak) return longest_streak ``` 上述代码通过只对可能是新序列起始位置的元素执行内部循环,从而大大减少了不必要的运算次数[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝羽飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值