题目
思路
这道题最直接的想法就是排序,排序之后连续的序列就很容易找到了。不过排序的时间复杂度是
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;
};