标签:map cnt return nums int 序列 128 uf LeetCode
具体思想:
具体思路分两种,一种是map哈希,一种是并查集;
使用标准数组hash会超时;
1.map哈希:
map保存是否出现,但是有一个遍历的trick;
如果map[i]出现,则枚举map[i+1];
如果用该方法,则map[i-1]必定已经枚举过,所以必定只需要枚举map[i-1]不存在的元素即可;
2.并查集:
连续相邻的构成一个并查集,这里注意一下示例代码的边查边遍历;
具体代码:
1.map哈希:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
map<int,int>mp;
for(auto ele:nums){
mp[ele]=1;
}
int cnt=0;
for(int i=0;i<nums.size();i++){
if(mp.find(nums[i]-1)==mp.end()){
int c=0;
int num=nums[i];
while(mp.find(num)!=mp.end()){
c++;
num++;
}
cnt=max(c,cnt);
}
}
return cnt;
}
};
2.并查集:
class Solution {
public:
// cnt用于记录当前集合的元素个数
unordered_map<int,int> uf, cnt;
int find(int i){
return i == uf[i] ? i: uf[i] = find(uf[i]);
}
int merge(int x, int y){
x = find(x); y = find(y);
if(x == y) return cnt[x];
uf[y] = x;
//更新合并之后的连通分量的元素个数
cnt[x] += cnt[y];
return cnt[x];
}
int longestConsecutive(vector<int>& nums) {
if(nums.size() == 0)
return 0;
for(int i: nums) uf[i] = i, cnt[i] = 1;
int ans = 1;
for(int i: nums){
if(i != INT_MAX && uf.count(i+1)) ans = max(ans, merge(i, i+1));
}
return ans;
}
};
标签:map,cnt,return,nums,int,序列,128,uf,LeetCode 来源: https://blog.csdn.net/m0_66776925/article/details/123120887
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。