題目描述
給定一個未排序的整數數組,找出最長連續序列的長度。
要求算法的時間複雜度爲 O(n)
。
示例:
輸入: [100, 4, 200, 1, 3, 2]
輸出: 4
解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度爲 4。
解題思路
本題要求時間爲O(n)
,即掃描一遍就需要得出結果。
可以採用哈希表的原理,採用unorded_set即可,按照以下步驟計算:
- 將
nums
中的數據放入set
中; - 對於
nums
中的每個數nums[i]
,若nums[i]-1
已經在set
中,則繼續掃描下一個數; - 若
nums[i]-1
不在set
中,則查找nums[i]+1
,直到找不到爲止,最終返回最大的max_length
。
比較巧妙的地方就是查找nums[i]-1
,如果存在的話就按照nums[i]-1
的結果返回max_length
即可,減少了時間複雜度。
具體實現過程可參考代碼及註釋。
完整代碼
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
//定義一個集合,用於查重
unordered_set<int>set;
//將nums中的數據出入到set中
for(int i = 0;i<nums.size();i++){
set.insert(nums[i]);
}
//對於nums中的每個數nums[i],若nums[i]-1已經在set中,則繼續掃描下一個數
//若nums[i]-1不在set中,則查找nums[i]+1,直到找不到爲止,最終返回最大的length
int max_length = 0;
for(int i = 0;i<nums.size();i++){
//先找nums[i]-1
if(set.count(nums[i]-1) == 0){
int current_length = 1;
int current_number = nums[i] + 1;
//再找nums[i] + 1
while(set.count(current_number) == 1){
current_length += 1;
current_number += 1;
}
max_length = max(max_length, current_length);
}
}
return max_length;
}
};