128. 最长连续序列

35 阅读1分钟

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

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

  • 连续指的是数值连续,不是数组下标连续。
  • 不要求原数组有序
  • 元素可能重复,重复元素只算一次。
  • 必须 O(n) ,不能先排序(排序是 O(n log n))。

思路

  1. 把所有数字放进一个 HashSet,去重。
  2. 遍历每个数 x
  • 如果 x-1 不在 set 中,说明 x 是一个连续序列的起点
  • x开始,依次看x+1, x+2`, ... 在不在 set 中,统计长度。
  1. 记录最大长度。
var longestConsecutive = function(nums) {
    const set = new Set(nums);
    let max = 0;
    for (let x of set) {
        if (!set.has(x - 1)) {      // 只从序列起点开始
            let len = 1;
            while (set.has(x + len)) len++;
            max = Math.max(max, len);
        }
    }
    return max;
};