DFS
- 每访问一个元素i,都直接去看i +1, i + 2… i + n直到这些元素不存在,通过记忆化搜索的方式,保证只会搜n次
class Solution {
public:
unordered_map<int, int> dic;
int dfs(int x){
if(!dic.count(x)) return 0;
if(dic[x] != 0) return dic[x];
return dic[x] = dfs(x + 1) + 1;
}
int longestConsecutive(vector<int>& nums) {
if(nums.size() == 0 ) return 0;
int res = 1;
for(auto e: nums){
dic[e] = 0;
}
for(auto e: nums){
res = max(res, dfs(e));
}
return res;
}
};
并查集
class Solution {
public:
unordered_map<int, int> par, count;
int find(int v){
return par[v] == v?v:par[v] = find(par[v]);
}
int merge(int u, int v){
u = find(u);
v = find(v);
if(u != v){
par[v] = par[u];
count[u] += count[v];
}
return count[u];
}
int longestConsecutive(vector<int>& nums) {
if(nums.size() == 0 ) return 0;
int res = 1;
for(auto e: nums){
par[e] = e;
count[e] = 1;
}
for(auto e: nums){
if (count.count(e + 1) )
res = max(res, merge(e + 1, e));
}
return res;
}
};