最长连续序列
字数 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:详细算法步骤

  1. 将所有数字存入哈希集合
  2. 初始化最长序列长度max_length = 0
  3. 遍历数组中的每个数字num:
    • 如果num-1不在集合中,说明num是序列起点
    • 从num开始,依次检查num+1, num+2...是否存在
    • 计算当前序列长度current_length
    • 更新max_length = max(max_length, current_length)
  4. 返回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)时间内解决了看似需要排序的问题,是哈希算法应用的经典范例。

最长连续序列 题目描述: 给定一个未排序的整数数组,要求找出数字连续的最长序列的长度。算法的时间复杂度必须为 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)时间内解决了看似需要排序的问题,是哈希算法应用的经典范例。