题目描述
给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
示例 :
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
代码
哈希法(O(n))
思路:用一个哈希存所有元素, 然后随机取一个元素, 删除其前后连续的数字即可。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> hash;
for(auto&i:nums)
hash.insert(i);
int cur;
int prev,next;
int maxx=0;
while(!hash.empty()){
cur=*(hash.begin());
next=cur+1;
prev=cur-1;
hash.erase(cur);
while(hash.count(next)){
hash.erase(next);
next++;
}
while(hash.count(prev)){
hash.erase(prev);
prev--;
}
maxx=max(maxx,next-prev-1);
}
return maxx;
}
};
排序法 (O(logn))
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
int n=nums.size();
sort(nums.begin(),nums.end());
//int len=unique(nums.begin(),nums.end())-nums.begin();//去重后的长度
/*
for(int i=0;i<len;i++)
cout<<nums[i]<<" ";
return 1;
*/
if(nums.size()==0)
return 0;
int maxx=1;
int sum=1;
for(int i=1;i<n;i++){
if(nums[i]==nums[i-1]+1){
sum++;
}
else if(nums[i]==nums[i-1])
continue;
else {
maxx = max(maxx,sum);
sum=1;
}
}
maxx=max(maxx,sum);
return maxx;
}
};