题目描述
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
解题思路
暴力,哈希表,并查集都可以。
并查集很好的博客。因为规定了时间复杂度,先排序不满足要求。注:本题的标签之前没有哈希表,但是用哈希表(unordered_set
)可满足要求,用并查集稍复杂。
- 哈希表:这些数字用一个
HashSet
保存(或者用 Python 里的Set
),实现O(1)
时间的查询,同时,我们只对“当前数字 - 1
”不在哈希表里的数字作为连续序列的第一个数字去找对应的最长序列,这是因为其他数字一定已经出现在了某个序列里了。(代码一看便懂) - 并查集:参考1,参考2。
参考代码
// 用哈希表
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int length = nums.size();
if(length == 0)
return 0;
unordered_set<int> mSet(nums.begin(), nums.end());
int maxLength = 0;
for(auto num: mSet){
int temp = num;
if(mSet.count(temp-1) == 0){ // 这里保证了整体时间复杂度为O(n),其实撑死就O(2n)
int tempLength = 1;
while(mSet.count(temp+1) != 0){
tempLength++;
temp++;
}
maxLength = max(maxLength, tempLength);
}
}
return maxLength;
}
};