128. 最长连续序列

Origin: LeetCode 128

题目描述

给定一个未排序的整数数组 nums,找出数字连续的最长序列的长度。要求时间复杂度 O(n)。

示例

Input: nums = [100, 4, 200, 1, 3, 2] Output: 4 Explanation: 最长连续序列是 [1, 2, 3, 4],长度 4。

Input: nums = [0, 3, 7, 2, 5, 8, 4, 6, 0, 1] Output: 9

约束

  • 0 <= nums.length <= 10
  • -10^9 <= nums[i] <= 10

关键信息

  • 要求 O(n),不能排序(排序是 O(n log n))
  • 用 Set 存所有数,从每个序列起点开始数
  • 序列起点 = num - 1 不在 Set 中

Resolution

我的解法

function longestConsecutive(nums: number[]): number {
    const set = new Set(nums)
    let maxLength = 0
    for (const num of set) {
        if (!set.has(num - 1)) {
            let length = 1
            let cur = num
            while (set.has(cur + 1)) {
                cur++
                length++
            }
            maxLength = Math.max(maxLength, length)
        }
    }
    return maxLength
}

解题思路

Set 去重后,只从序列起点开始数。起点判断:num - 1 不在 Set 中,说明 num 是某个连续序列的开头。

  • 遍历 Set(不是 nums),避免重复元素重复检查
  • 是起点 → 往后数 num+1, num+2… 直到不在 Set 里
  • 不是起点 → 跳过(它一定被某个起点数过了)

踩坑

  • 遍历 nums 而不是 set,大量重复元素导致超时(几万个 0)
  • 每个元素最多被 while 访问一次,总体 O(n)

复杂度

  • 时间:O(n)
  • 空间:O(n)