0.思路
如果当前数x存在前驱数x-1,那么它已经处于一个连续序列中,需要找到的是连续序列开始的位置,然后遍历检查该序列的最长长度
使用哈希可以使查找的时间复杂度降为O(1)
1.代码实现
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
// 如果当前数x存在前驱数x-1,那么它已经处于一个连续序列中,需要找到连续序列开始的位置然后遍历检查最长长度
//step1 去重
unordered_set<int> numSet;
for(int num:nums){
numSet.insert(num);
}
// step2 遍历一遍查找有没有x-1 有则跳过 没有说明这是序列头,记录以它为开头的序列长度并判断是否最长
int currentLen=0,maxLen=0;
if(nums.size()>0) maxLen=1;
for(int num:numSet){
if(numSet.find(num-1)!=numSet.end()){
currentLen=0;// 为下一个序列清零
continue;
}
else{
currentLen++;
int nextInt=num+1;//查找以num开头的最长序列,每次检查+1是否存在
while(numSet.find(nextInt)!=numSet.end()){
nextInt+=1;
currentLen++;
if(currentLen>=maxLen) maxLen=currentLen;
}
currentLen=0;// 清空当前记录
}
}
return maxLen;
}
};