​128. 最长连续序列​

难度困难437

给定一个未排序的整数数组,找出最长连续序列的长度。

要求算法的时间复杂度为 O(n)

示例:


输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 ​​[1, 2, 3, 4]。它的长度为 4。​


解题思路:

我们首先走一遍数列,打一个hash,知道有什么数后,我们就遍历数列,然后尝试从这个点左右延伸,延伸的长度范围内的数字我们下次都可以不用走,可以证明这样我们每个数字最多遍历2次。至于延伸的时候我们需要判断数字在不在数列内我们可以用第一次跑的hash的结果。

class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size() == 0)return 0;
unordered_set<int> ms1,ms2;
for(auto it:nums)ms1.insert(it);
int ans = 1;
for(int i=0;i<(int)nums.size();i++){
if(ms2.count(nums[i]))continue;
int cnt = 0;
for(int no = nums[i];;no++){
if(!ms1.count(no))break;
cnt++;
ms2.insert(no);
}
int cnt2 = 0;
for(int no=nums[i];;no--){
if(!ms1.count(no))break;
cnt2++;
ms2.insert(no);
}
cnt+=cnt2-1;
ans=max(ans,cnt);
}
return ans;
}
};