59 lines
1.9 KiB
JavaScript
59 lines
1.9 KiB
JavaScript
/**
|
||
* https://leetcode.cn/problems/longest-consecutive-sequence/?envType=study-plan-v2&envId=top-interview-150
|
||
* @param {number[]} nums
|
||
* @return {number}
|
||
*/
|
||
const longestConsecutive = function (nums) {
|
||
|
||
};
|
||
|
||
/*
|
||
思路:题目所给的数组是无序的,所以直接对数组排序,依次遍历整个数组,如果当前元素大于前一个元素,并且等于前一个元素加1,就
|
||
把统计的长度加1,如果不满足就比较是否比最大长度还大,是的话就把这个长度作为为最大长度
|
||
*/
|
||
|
||
function f1(nums) {
|
||
nums.sort((a, b) => a - b);
|
||
if (nums.length === 0) return 0;
|
||
if (nums.length === 1) return 1;
|
||
let maxLen = 1; // 最大长度
|
||
let curLen = 1; // 统计长度
|
||
for (let i = 1; i < nums.length; i++) {
|
||
const preNum = nums[i - 1];
|
||
if (nums[i] === preNum) {
|
||
continue;
|
||
} else if (preNum + 1 === nums[i]) {
|
||
curLen++;
|
||
} else {
|
||
maxLen = Math.max(maxLen, curLen);
|
||
curLen = 1;
|
||
}
|
||
}
|
||
return Math.max(curLen, maxLen); // 如果后面一个很长的连续序列
|
||
}
|
||
|
||
/*
|
||
题目要求我们在O(n)的时间复杂度完成,上面的做法使用了一次排序,nlogn,不符合要求,正确的做法可以先用set对整个数组去重,
|
||
整个过程的时间复杂度为O(n),之后遍历整个Set,如果当前的num-1在set中不存在,就表明,这个num是数组中某个序列的开头,开始统计
|
||
num+1在set中存在吗?如果存在就计数加1,如果不存在继续遍历
|
||
*/
|
||
|
||
function f2(nums) {
|
||
if (nums.length === 0) return 0;
|
||
const set = new Set(nums);
|
||
let maxLen = 1;
|
||
let curLen = 1;
|
||
for (const num of set) {
|
||
if (set.has(num - 1)) continue;
|
||
// 表明num是某个连续序列的开头,直接开始统计
|
||
let next = num + 1;
|
||
while (set.has(next)) {
|
||
curLen++;
|
||
next++;
|
||
}
|
||
maxLen = Math.max(maxLen, curLen);
|
||
curLen = 1;
|
||
}
|
||
return maxLen;
|
||
}
|