参考资料:
题目描述
样例
思路
本题是对并查集的简单应用,如果j
能被i
整除,则i
、j
、j/i
应该被merge
到一个集合里。
代码
#define maxn 20010
int sum[100005];
int f[100005];
int Rank[100005];
void init(int n){
for(int i=0;i<=n;i++){
f[i] = i;
Rank[i] = 1;
}
}
int find(int x){
return (x==f[x])? x: (f[x]=find(f[x]));
}
void merge(int x, int y){
int X=find(x), Y=find(y);
if(X==Y) return;
else if(Rank[X]>Rank[Y]) f[Y] = X;
else if(Rank[Y]>Rank[X]) f[X] = Y;
else{
f[X] = Y;
Rank[Y]++;
}
}
class Solution {
public:
int largestComponentSize(vector<int>& nums) {
memset(sum, 0, sizeof(sum));
memset(f, 0, sizeof(f));
memset(Rank, 0, sizeof(Rank));
int M = 0;
for(int i=0;i<nums.size();i++)
M = max(M, nums[i]);
init(M);
for(int i=0;i<nums.size();i++){
for(int j=2;j*j<=nums[i];j++){
if(nums[i]%j==0){
merge(nums[i], j);
merge(nums[i], nums[i]/j);
}
}
}
int ans = 0;
for(int i=0;i<nums.size();i++){
sum[find(nums[i])]++;
ans = max(ans, sum[find(nums[i])]);
}
return ans;
}
};