这个代码是在评论区copy大佬的,觉得写的很不错了,借鉴了!
class Solution {
class UnionFind {
public:
vector<int> parent;
vector<int> size;
int n;
UnionFind(int _n): n(_n), parent(_n), size(_n, 0) {
iota(parent.begin(), parent.end(), 0);
}
int findset(int x) {
return parent[x] == x ? x : parent[x] = findset(parent[x]);
}
bool unite(int x, int y) {
x = findset(x);
y = findset(y);
if (x == y) {
return false;
}
parent[y] = x;
size[x] += size[y];
return true;
}
void add(int x){
++size[findset(x)];
}
int biggest(){
return *max_element(begin(size), end(size));
}
};
public:
int largestComponentSize(vector<int>& nums) {
int n = nums.size(), k = *max_element(begin(nums), end(nums));
UnionFind uf(k + 1);
for(int x: nums){
int rear = -1;
for(int i = 2; i <= sqrt(x); ++i){
if(x % i == 0) {
if(rear != -1) uf.unite(rear, i);
else uf.add(rear = i);
}
while(x % i == 0) x /= i;
}
if(x > 1){
if(rear != -1) uf.unite(rear, x);
else uf.add(x);
}
}
return uf.biggest();
}
};