最长连续序列
字数 754 2025-10-26 14:40:39
最长连续序列
题目描述:给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。要求算法的时间复杂度为 O(n)。
解题过程:
-
理解问题核心
- 我们要找的是"数值连续"的序列,比如 [1,2,3,4]
- 序列中的数字在原数组中可以不连续出现
- 要求时间复杂度 O(n),所以不能先排序(排序至少 O(n log n))
-
关键观察
- 对于任意连续序列,它一定有起点(序列中最小的数)
- 起点的特征:nums 中不存在比它小 1 的数(即 num-1 不在数组中)
- 从这个起点开始,我们可以不断检查 num+1 是否在数组中,从而确定序列长度
-
算法思路
- 用哈希集合存储所有数字,实现 O(1) 的查找
- 遍历数组中的每个数字
- 对于每个数字,如果它是某个序列的起点(即 num-1 不在集合中),就开始向后扩展序列
- 记录遇到的最长序列长度
-
详细步骤
def longestConsecutive(nums): if not nums: return 0 num_set = set(nums) # 转换为集合,O(n) max_length = 0 for num in num_set: # 只有当num是序列起点时才处理 if num - 1 not in num_set: current_num = num current_length = 1 # 向后扩展序列 while current_num + 1 in num_set: current_num += 1 current_length += 1 # 更新最大长度 max_length = max(max_length, current_length) return max_length -
复杂度分析
- 时间复杂度:O(n)
- 创建集合:O(n)
- 外层循环:每个元素最多被访问一次
- 内层while:每个元素最多被访问一次(只有作为起点时才会进入内层循环)
- 空间复杂度:O(n),用于存储哈希集合
- 时间复杂度:O(n)
-
举例说明
对于 nums = [100, 4, 200, 1, 3, 2]:- 集合:{100, 4, 200, 1, 3, 2}
- 处理 100:100-1=99 不在集合中,向后扩展得到序列 [100],长度 1
- 处理 4:4-1=3 在集合中,跳过
- 处理 200:200-1=199 不在集合中,向后扩展得到序列 [200],长度 1
- 处理 1:1-1=0 不在集合中,向后扩展得到序列 [1,2,3,4],长度 4
- 最终结果:4
这种方法确保了每个数字最多被处理两次,达到了 O(n) 的时间复杂度要求。