哈希算法题目:最长连续序列
字数 921 2025-10-25 18:32:29
哈希算法题目:最长连续序列
题目描述:
给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
解题过程:
-
问题理解
我们需要找到最长的连续整数序列。例如,数组 [100, 4, 200, 1, 3, 2] 中最长连续序列是 [1, 2, 3, 4],长度为 4。注意序列中的数字在原始数组中不一定相邻。 -
关键思路
最直接的思路是对数组排序,然后遍历查找连续序列。但排序需要 O(n log n) 时间,不满足 O(n) 要求。我们可以用哈希集合(HashSet)来优化:- 先将所有数字存入哈希集合,实现 O(1) 的查找
- 对于每个数字,如果它的前一个数(num-1)不在集合中,说明它是一个连续序列的起点
- 从起点开始逐个检查后续数字(num+1, num+2...)是否在集合中,统计序列长度
-
逐步求解
步骤 1:构建哈希集合- 遍历数组,将所有数字加入哈希集合(自动去重)
- 示例 [100, 4, 200, 1, 3, 2] 的集合为 {100, 4, 200, 1, 3, 2}
步骤 2:寻找序列起点并扩展
- 遍历集合中的每个数字 num
- 如果 num-1 不在集合中,说明 num 是一个序列的起点
- 从 num 开始,依次检查 num+1, num+2... 是否在集合中
- 统计连续存在的数字个数,即为当前序列长度
- 更新最大长度
示例详细过程:
- 数字 100:99 不在集合中,是起点。检查 101 不在集合,序列长度 1
- 数字 4:3 在集合中,不是起点,跳过
- 数字 200:199 不在集合中,是起点。检查 201 不在,序列长度 1
- 数字 1:0 不在集合中,是起点。检查 2 在集合,3 在集合,4 在集合,5 不在集合,序列长度 4
- 数字 3:2 在集合中,跳过
- 数字 2:1 在集合中,跳过
- 最长序列长度为 4
-
复杂度分析
- 时间复杂度:O(n)。每个数字最多被访问两次(一次在遍历集合,一次在序列扩展)
- 空间复杂度:O(n)。哈希集合存储所有数字
这个算法通过哈希集合快速查找,避免了排序,实现了线性时间复杂度。