知識點:滑動窗口
題目:給定一個未排序的整數(shù)數(shù)組,找出最長連續(xù)序列的長度。
難度:困難
要求算法的時間復(fù)雜度為 O(n)。
示例:
輸入: [100, 4, 200, 1, 3, 2]
輸出: 4
解釋: 最長連續(xù)序列是 [1, 2, 3, 4]。它的長度為 4。
一看到這個題就知道應(yīng)該用滑動窗口的思想做,但是在做的過程中犯了以下幾個錯誤??,,記錄一下。
- 對數(shù)組排序以后,最長連續(xù)序列,沒有考慮到兩個連續(xù)的數(shù)一樣的狀況,所以在輸入【1,2,0,1】的時候出錯了
- count 重置的時候想當(dāng)然的重置為了0,其實應(yīng)該重置為 1
- 最后忘記再計算一遍len的長度
/**
* @param {number[]} nums
* @return {number}
*/
var longestConsecutive = function(nums) {
// 1.檢測邊界條件
if(nums.length < 2) return nums.length
// 2.數(shù)組從小到大進行排序
nums = nums.sort((a, b) => a - b)
// 3.開始查找
let left = 0, current = 0, right = 1, len = 1, count = 1
while(right < nums.length) {
// 3種情況:連續(xù)(count++);兩個數(shù)相同(不用處理,犯錯點);兩個數(shù)不連續(xù)(從新開始計算長度)
const temp = nums[right] - nums[current]
if( temp === 1) {
// 連續(xù)
count++
} else if(temp > 1) {
// 不連續(xù)了
len = Math.max(len, count)
left = right
count = 1 // 這個地方要注意,重置為1,而不是0(犯錯點)
}
right++
current++
}
// 4.這步不能忘記了(犯錯點)
len = Math.max(len, count)
// 5.返回結(jié)果
return len
};