1.題目
給定一個未排序的整數數組,找出最長連續序列的長度。
要求算法的時間複雜度爲 O(n)。
示例:
輸入: [100, 4, 200, 1, 3, 2]
輸出: 4
解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度爲 4。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-consecutive-sequence/
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2.題解
思路:
一見到時間複雜度是O(n),而且還是關於數組以及連續數字相關的,直接就想到Hash,直接存set,一個一個找。
直接寫出來的複雜度是n方的。
最主要應該優化的是保證已經經查詢過的元素就沒有必要在進行計算了,因爲結果一定比現在最長的小,所以很關鍵的部分是
if(!num_set.count(num - 1))
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;
}
};