
可以用哈希表解决,先遍历选取每一个元素num作为起始值,然后判断num+1是否也在数组中,如果在就序列长度+1,但是用哈希表这么做实际上时间复杂度为o(n^2),为了降低到n,每一个元素只能访问一次,那么也就是如果num做为起始值,那么他的前驱num-1是不能在数组中的,这样就可以避免重复访问
cpp
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> numSet;
for(const int& num:nums)
numSet.insert(num);
int result=0;
for(const int& num:nums){
if(numSet.find(num-1)!=numSet.end())
continue;
else{
int len=1;
int currentNum=num;
while(numSet.find(currentNum+1)!=numSet.end()){
len++;
currentNum++;
}
result=max(result,len);
}
}
return result;
}
};
然而虽然代码和官方差不多还是有用例超时,对于如下这种有m个0的如果作为起始值,后续还有1,2,3,4让其进入内层循环的,时间复杂度为o(mn),为了避免这种情况还得对0去重

cpp
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> numSet;
for(const int& num:nums)
numSet.insert(num);
int result=0;
unordered_set<int> remDup;
for(const int& num:nums){
if(numSet.find(num-1)!=numSet.end()||remDup.find(num)!=remDup.end())
continue;
else{
remDup.insert(num);
int len=1;
int currentNum=num;
while(numSet.find(currentNum+1)!=numSet.end()){
len++;
currentNum++;
}
result=max(result,len);
}
}
return result;
}
};