给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
示例:
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
通过次数48,875提交次数98,001
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty()){
return 0;
}
if(nums.size()==1){
return 1;
}
map<int,int>mymap;
for(auto n:nums){
mymap[n]++;
}
//cout<<mymap.size()<<endl;
int i=0;
for(auto& iter:mymap){
//cout<<"iter "<<iter.first<<endl;
nums[i] = iter.first;
//cout<<nums[i]<<" ";
++i;
}
//cout<<endl;
vector<int>dp(nums.size(),1);
int res=1;
//cout<<res<<" "<<endl;
for(int j=1;j<nums.size();++j){
if(nums[j]==(nums[j-1]+1)){
dp[j] = dp[j-1]+1;
}else{
continue;
}
//cout<<dp[j]<<endl;
res = max(res,dp[j]);
}
return res;
}
};
作者:he-zi-11
链接:https://leetcode-cn.com/problems/longest-consecutive-sequence/solution/zui-chang-lian-xu-xu-lie-zhu-yao-yun-yong-shu-ju-j/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
第二种方法
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty()){
return 0;
}
if(nums.size()==1){
return 1;
}
sort(nums.begin(),nums.end());
vector<int>dp(nums.size(),1);
int res=1;
//cout<<res<<" "<<endl;
for(int j=1;j<nums.size();++j){
if(nums[j]==(nums[j-1]+1)){
dp[j] = dp[j-1]+1;
}else if(nums[j]==nums[j-1]){
dp[j] = dp[j-1];
}else{
continue;
}
//cout<<dp[j]<<endl;
res = max(res,dp[j]);
}
return res;
}
};
但是上面的方法在复杂度方面不合格
这个更绝
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.empty()){
return 0;
}
unordered_set<int>myset(nums.begin(),nums.end());
int res = 0;
for(auto num:nums){
int count=0;
if(!myset.count(num-1)){
while(myset.count(num)){
count++;
num++;
}
}
res = max(res,count);
}
return res;
}
};