最长连续序列
字数 1086 2025-11-15 15:39:14
最长连续序列
题目描述:
给定一个未排序的整数数组,要求找出数字连续的最长序列的长度。算法的时间复杂度必须为 O(n)。
示例:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长连续序列是 [1, 2, 3, 4],长度为 4
解题过程:
步骤1:问题分析
- 数组未排序,不能直接遍历找连续序列
- 要求O(n)时间复杂度,不能先排序(排序至少O(nlogn))
- 连续序列定义:数字连续递增,每个数比前一个大1
- 需要高效判断某个数是否存在,以及它的相邻数是否存在
步骤2:核心思路
使用哈希集合存储所有数字,实现O(1)时间查询
对于每个数字,检查它是否是某个连续序列的起点:
- 如果num-1不在集合中,说明num是某个序列的起点
- 从起点开始,不断检查num+1, num+2...是否存在,计算序列长度
步骤3:详细算法步骤
- 将所有数字存入哈希集合
- 初始化最长序列长度max_length = 0
- 遍历数组中的每个数字num:
- 如果num-1不在集合中,说明num是序列起点
- 从num开始,依次检查num+1, num+2...是否存在
- 计算当前序列长度current_length
- 更新max_length = max(max_length, current_length)
- 返回max_length
步骤4:示例推演
以nums = [100,4,200,1,3,2]为例:
哈希集合:{100, 4, 200, 1, 3, 2}
遍历过程:
- num=100:99不在集合中,是起点
检查101,102...都不在,序列长度=1 - num=4:3在集合中,不是起点,跳过
- num=200:199不在集合中,是起点
检查201,202...都不在,序列长度=1 - num=1:0不在集合中,是起点
检查2在集合中,3在集合中,4在集合中,5不在
序列:1,2,3,4,长度=4 - num=3:2在集合中,不是起点,跳过
- num=2:1在集合中,不是起点,跳过
最终最长序列长度=4
步骤5:复杂度分析
- 时间复杂度:O(n)
- 构建哈希集合:O(n)
- 遍历数组:O(n)
- 每个数字最多被内层循环访问2次(作为起点和作为其他序列的中间元素)
- 空间复杂度:O(n),用于存储哈希集合
步骤6:关键优化点
- 通过检查num-1是否存在来判断起点,避免重复计算
- 哈希集合提供O(1)的查询操作
- 每个数字最多被访问两次,保证线性时间复杂度
这个算法巧妙地利用哈希集合的特性,在O(n)时间内解决了看似需要排序的问题,是哈希算法应用的经典范例。