LeetCode热题(JS版) - 128. 最长连续序列

118 阅读1分钟

题目描述

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)。

示例:

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

解题思路

题目要求算法的时间复杂度为 O(n),因此需要使用一些巧妙的数据结构进行处理。本题使用哈希表(Map)来存储每个连续序列的边界值,并记录当前序列的长度。

具体实现如下:

  • 对于每个数,如果其在哈希表中不存在,则以该数为左右边界的连续序列长度均为 1。
  • 若该数已在哈希表中存在,则跳过不做处理。
  • 对于每个数,遍历该数左右相邻的数(即 num - 1 和 num + 1),如果其在哈希表中存在,则将当前序列合并到相邻序列中,并更新该序列的长度。

最后,遍历所有序列的长度,返回其中最大值即可。

代码实现

function longestConsecutive(nums: number[]): number {
  let map = new Map<number, number>();
  let maxLen = 0;

  for (let num of nums) {
    if (map.has(num)) {
      continue;
    }
    // 查找 num 前后是否存在连续数字
    let left = map.get(num - 1) || 0;
    let right = map.get(num + 1) || 0;
    
    // 将 num 合并到相邻序列中,并更新边界长度
    let len = left + right + 1;
    map.set(num, len);
    map.set(num - left, len);
    map.set(num + right, len);
    // console.log(num, left, right, len, map)
    // 更新最大长度
    maxLen = Math.max(maxLen, len);
  }

  return maxLen;
}

不理解的话看下过程:

image.png

image.png

复杂度分析

时间复杂度:O(n)

  • 遍历整个数组,时间复杂度为 O(n)。
  • 在哈希表中查找元素的时间复杂度为 O(1)。

空间复杂度:O(n)

  • 哈希表最坏情况下需要存储 n 个元素。