力扣热题100之最长连续序列

115 阅读1分钟

题目

image.png

思路

这道题最直接的想法就是排序,排序之后连续的序列就很容易找到了。不过排序的时间复杂度是 O(NlogN),而题目要求我们时间复杂度为 O(N),这就得另想办法了。

想找连续序列,首先要找到这个连续序列的开头元素,然后递增,看看之后有多少个元素还在 nums 中,即可得到最长连续序列的长度了。

我们可以用空间换时间的思路,把数组元素放到哈希集合里面,然后去寻找连续序列的第一个元素,即可在 O(N) 时间找到答案。

比方说 nums = [8,4,9,1,3,2],我们先找到 1,然后递增,找到了 2, 3, 4,这就是一个长度为 4 的序列。又找到 8,网上递增执照到了 9,这是一个长度为 2 的序列。

具体逻辑看代码吧,虽然 for 循环嵌套 while 循环,但是每个元素只会被遍历到最多两次,所以均摊时间复杂度依然为 O(N)

解法

var longestConsecutive = function(nums) {
    // 转化成哈希集合,方便快速查找是否存在某个元素
    let set = new Set(nums);

    let res = 0;

    for (let num of set) {
        if (set.has(num - 1)) {
            // num 不是连续子序列的第一个,跳过
            continue;
        }
        // num 是连续子序列的第一个,开始向上计算连续子序列的长度
        let curNum = num;
        let curLen = 1;

        while (set.has(curNum + 1)) {
            curNum += 1;
            curLen += 1;
        }
        // 更新最长连续序列的长度
        res = Math.max(res, curLen);
    }

    return res;
};