Skip to main content

最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入:nums = [100,4,200,1,3,2] 输出:4 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。 示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1] 输出:9 示例 3:

输入:nums = [1,0,1,2] 输出:3

简单做法:sort排序,再遍历 时间复杂度O(kklogk)

进阶做法:利用哈希表(Set)来快速检查元素的连续性。具体思路是:将所有元素存入Set中,然后遍历每个元素,若其为序列起点(即无前驱元素),则尝试向后扩展并记录最长序列长度。

function longestConsecutive(nums) {
const numSet = new Set(nums);
let longestStreak = 0;

for (const num of numSet) {
// 检查是否为序列起点(无前驱元素)
if (!numSet.has(num - 1)) {
let currentNum = num;
let currentStreak = 1;

// 尝试扩展序列
while (numSet.has(currentNum + 1)) {
currentNum += 1;
currentStreak += 1;
}

longestStreak = Math.max(longestStreak, currentStreak);
}
}

return longestStreak;
}

代码解释:

  1. 哈希表初始化:将数组元素存入Set,支持O(1)时间的存在性检查。
  2. 遍历寻找起点:对于每个元素,若其无前驱元素(即num-1不在Set中),则其为序列起点。
  3. 扩展序列:从起点开始不断检查后继元素,累加连续序列的长度。
  4. 复杂度分析
    • 时间复杂度:O(n)。每个元素最多被访问两次(一次插入Set,一次扩展序列)。
    • 空间复杂度:O(n)。主要用于存储哈希表。