題目大意:求未排序數組中的最長連續序列的長度,要求時間複雜度爲O(n)。例如[100,4,200,1,3,2],len=4。
分析:哈希表unordered_set。
原題=>遍歷數組時需要判斷某個數(大一或小一)是否存在=>用哈希表(查詢O(1))。
num依次插入set,遍歷set,對每個num都嘗試匹配num+1,num+2...是否存在。最壞還是O(n²)。
所以加上“跳過邏輯”:存在num-1時跳過,也就是隻有num爲連續序列的第一個數的時候,纔開始內層循環匹配。達到了O(n)。
代碼:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> num_set;
for (int num : nums) {
num_set.insert(num);
}
int longestStreak = 0;
for (int num : num_set) {
if (!num_set.count(num - 1)) { //不是連續序列的第一個數就跳過
int currentNum = num;
int currentStreak = 1;
while (num_set.count(currentNum + 1)) { //內層循環匹配判斷是否存在
currentNum++,currentStreak++;
}
longestStreak = max(longestStreak, currentStreak);
}
}
return longestStreak;
}
};