【LeetCode】128. 最长连续序列
💡 解题思路
核心目标:在未排序数组中找出数字连续的最长序列长度(不要求元素在数组中连续),时间复杂度必须为 O(n)。
关键策略:利用哈希集合实现 O(1) 时间复杂度的元素查找,通过识别连续序列的起点(即不存在前驱元素 num-1),向后扩展计算序列长度。
⚙️ 关键步骤
- 哈希集合初始化
将数组元素存入哈希集合(map[int]bool),实现去重和 O(1) 查找。 - 识别序列起点
遍历集合,若元素num的前驱num-1不存在,则num是序列起点。 - 扩展序列长度
从起点向后查找连续数字(num+1, num+2...),统计序列长度。 - 更新最大值
比较并记录最长序列长度。
⏱ 复杂度分析
| 步骤 | 时间复杂度 | 空间复杂度 | 说明 |
|---|---|---|---|
| 哈希集合构建 | O(n) | O(n) | 存储所有元素 |
| 序列起点检测 | O(n) | O(1) | 每个元素最多访问两次 |
| 序列扩展 | O(n) | O(1) | 嵌套循环但元素不重复访问 |
| 总计 | O(n) | O(n) | 满足题目要求 |
🚀 代码实现
💎 代码解析
- 哈希集合构建
numSet := make(map[int]bool)创建哈希集合,存储所有不重复元素。 - 起点检测逻辑
if !numSet[num-1]确保只从序列起点开始扩展,避免重复计算。 - 序列扩展
for numSet[currentNum+1]向后查找连续数字,实时更新当前序列长度。 - 性能优化点
- 去重处理:哈希集合自动过滤重复元素
- 快速失败:仅起点触发序列扩展,减少无效操作
📊 执行示例
🌟 优势总结
- 严格 O(n) 时间复杂度:每个元素最多被访问两次(起点检测 + 序列扩展)
- 空间换时间:哈希集合实现 O(1) 查找,比排序法(O(n log n))更高效
- 边界鲁棒性:显式处理空数组和重复元素场景

浙公网安备 33010602011771号