问题
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。
输入: [100, 4, 200, 1, 3, 2]
输出: 4
解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。
通过并查集对这道题进行求解
class Solution{
public:
undered_map<int,int> F;
int father(int x)
{
if(F.count(x)==0)return x;
if(F[x]!=x)F[x]=father(x);
return F[x];
}
int longestConsecutive(vector<int> &nums)
{
F.clear();
for(auto x:nums)
{
F[x]=father(x);
if(F.count(x-1)>0) F[father(x-1)]=father(x);
if(F.count(x+1)>0) F[father(x+1)]=father(x+1);
}
int res = 0;
for (auto x:nums)
{
if(father(x)-x+1>res)
res = father(x) - x + 1;
}
return res;
}
}
或者用set来去重,然后遍历每一个元素,检测x-1是否存在如果存在则不进行计数,如果不存在则查找x+1,一直查找到不存在。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> num_set;
for(const int &num:nums)
{
num_set.insert(num);
}
int longStreak = 0;
for(const int &num:num_set)
{
if(!num_set.count(num-1))
{
int currentNum = num;
int currentSteak = 1;
cout<<currentNum;
while(num_set.count(currentNum+1))
{
currentNum++;
currentSteak++;
}
//cout<<endl;
longStreak = max(longStreak,currentSteak);
}
}
return longStreak;
}
};