方法1:
并查集,查找一个数的左右集合是否存在,若存在,加入到一个集合,并查集的遍历复杂度是O(n*a(n)),a(n)是不查过4的数
class Solution {
public:
int getFather(int x,int fa[])
{
if(x!=fa[x])
fa[x]=getFather(fa[x],fa);
return fa[x];
}
int longestConsecutive(vector<int>& nums) {
int n=nums.size();
int i;
int fa[n];
int cnt[n],maxn=0;
int vis[n];
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
unordered_map<int,int> mp;
for(i=0;i<n;i++)
{
fa[i]=i;
if(mp.find(nums[i])!=mp.end())
{
vis[i]=1;
continue;
}
mp[nums[i]]=i;
}
for(i=0;i<n;i++)
{
if(vis[i])
continue;
int x=nums[i];
int l=-1,r=-1;
if(mp.find(x-1)!=mp.end())
l=getFather(mp[x-1],fa);
if(mp.find(x+1)!=mp.end())
r=getFather(mp[x+1],fa);
if(l!=-1&&r!=-1)
{
fa[r]=l;
fa[i]=l;
}
else if(l!=-1)
fa[i]=l;
else if(r!=-1)
fa[i]=r;
}
for(i=0;i<n;i++)
{
getFather(i,fa);
cnt[fa[i]]++;
if(cnt[fa[i]]>maxn)
maxn=cnt[fa[i]];
}
return maxn;
}
};方法2:
使用unordered_set,但是遍历后删除元素,否则复杂度会是O(n^2)
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> myset(nums.begin(),nums.end());
int n=nums.size();
int maxn=0;
for(int i=0;i<n;i++)
{
int cnt=1;
myset.erase(nums[i]);
int x=nums[i]-1;
while(myset.find(x)!=myset.end())
{
cnt++;
myset.erase(x);
x--;
}
x=nums[i]+1;
while(myset.find(x)!=myset.end())
{
cnt++;
myset.erase(x);
x++;
}
if(cnt>maxn)
maxn=cnt;
}
return maxn;
}
};
本文介绍了两种求解最长连续整数序列的有效算法:并查集方法和基于unordered_set的方法。并查集方法通过维护每个元素的父节点来快速判断和合并区间,而第二种方法则利用了哈希集合的特点进行遍历并删除已处理元素,以避免重复计算。
647

被折叠的 条评论
为什么被折叠?



