這道題一拿到手首先想的是排序一下,然後再遍歷一遍數組,來找出最長連續子序列,但是這個時間複雜度最低也是o(logn)級別的,題中要求是o(n)級別的算法,所以不太行。
我還想到了一個,用下標數組的方法,最後也是隻掃描兩遍數組。但是這道題的話,沒有告訴數組中元素的範圍,所以不太好確定下標數組的長度,很明顯也不是用這種方法來做。
官方的一個思路是,先將數組中的元素存入查找表中,然後每一次枚舉該元素能延伸多長的序列(因爲用了查找表,所以每一次枚舉查找比較快),但是這中間有很多重複的計算,所以,在枚舉之前,要先看這個元素其前綴是否在查找表中,如果在就證明之前已經枚舉過這個元素了,就跳過,枚舉下一個。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> num_set;
for(const int& num : nums)
num_set.insert(num); //先將數組中的元素放入查找表中
int longestStreak = 0;
for(const int& num : num_set){
if(!num_set.count(num - 1)){ //查找其前綴是否存在,如不存在才進行判斷
int currentNum = num;
int currentStreak = 1;
while(num_set.count(currentNum + 1)){ //枚舉看能到多長的序列
currentNum += 1;
currentStreak += 1;
}
longestStreak = max(longestStreak,currentStreak);
}
}
return longestStreak;
}
};
其實感覺今天這一道困難比昨天那一道簡單還好理解一點。。。
最近有點太浪了啊,都已經6.6號了。明天要打起精神學習啊!!!