知识点:滑动窗口
题目:给定一个未排序的整数数组,找出最长连续序列的长度。
难度:困难
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
一看到这个题就知道应该用滑动窗口的思想做,但是在做的过程中犯了以下几个错误🙅,,记录一下。
- 对数组排序以后,最长连续序列,没有考虑到两个连续的数一样的状况,所以在输入【1,2,0,1】的时候出错了
- count 重置的时候想当然的重置为了0,其实应该重置为 1
- 最后忘记再计算一遍len的长度
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function(nums) {
// 1.检测边界条件
if(nums.length < 2) return nums.length
// 2.数组从小到大进行排序
nums = nums.sort((a, b) => a - b)
// 3.开始查找
let left = 0, current = 0, right = 1, len = 1, count = 1
while(right < nums.length) {
// 3种情况:连续(count++);两个数相同(不用处理,犯错点);两个数不连续(从新开始计算长度)
const temp = nums[right] - nums[current]
if( temp === 1) {
// 连续
count++
} else if(temp > 1) {
// 不连续了
len = Math.max(len, count)
left = right
count = 1 // 这个地方要注意,重置为1,而不是0(犯错点)
}
right++
current++
}
// 4.这步不能忘记了(犯错点)
len = Math.max(len, count)
// 5.返回结果
return len
};