/** * 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; }