c++
class Solution {
public:
class UnionSet {
public:
int *father, *cnt , n;
UnionSet(int n) : n(n) {
father = new int[n + 1];
cnt = new int[n + 1];
for (int i = 0; i <= n; i++) {
father[i] = i;
cnt[i] = 1;
}
}
int find(int x) {
return father[x] = (father[x] == x ? x : find(father[x]));
}
void merge(int a, int b) {
if (find(a) == find(b)) return ;
cnt[find(b)] += cnt[find(a)];
father[find(a)] = find(b);
return ;
}
};
int longestConsecutive(vector<int>& nums) {
UnionSet u(nums.size());
unordered_map<int, int> _map;
for (int i = 0; i < nums.size(); i++) {
if (_map.find(nums[i]) != _map.end()) continue;
if (_map.find(nums[i] - 1) != _map.end()) {
u.merge(i, _map[nums[i] - 1]);
}
if (_map.find(nums[i] + 1) != _map.end()) {
u.merge(i, _map[nums[i] + 1]);
}
_map[nums[i]] = i;
}
int ans = 0;
for (int i = 0; i < nums.size(); i++) {
if (u.find(i) == i && ans < u.cnt[i]) ans = u.cnt[i];
}
return ans;
}
};
js
class UnionSet {
constructor(n) {
this.father = new Array(n);
this.cnt = new Array(n);
for (var i = 0; i < n; i++) {
this.father[i] = i;
this.cnt[i] = 1;
}
}
find(x) {
return this.father[x] = (this.father[x] == x ? x : this.find(this.father[x]));
}
merge(a, b) {
this.cnt[this.find(b)] += this.cnt[this.find(a)];
this.father[this.find(a)] = this.find(b);
}
};
var longestConsecutive = function(nums) {
var _map = new Map();
var u = new UnionSet(nums.length);
for (var i = 0; i < nums.length; i++) {
if (_map.has(nums[i])) continue;
if (_map.has(nums[i] - 1)) {
u.merge(i, _map.get(nums[i] - 1));
}
if (_map.has(nums[i] + 1)) {
u.merge(i, _map.get(nums[i] + 1));
}
_map.set(nums[i], i);
}
var ans = 0;
for (var i = 0; i < nums.length; i++) {
if (u.find(i) == i) ans = Math.max(ans, u.cnt[i]);
}
return ans;
};