思路:并查集+因数分解
- 将nums中的每个数c进行因数分解,而后将c和该因子合并(merge)到并查集中
- 对nums中的每个数找到其祖先,并将祖先的子节点(cnt数组)加1并选择拥有最多子节点的祖先节点的子节点数
class Solution {
public void merge(int[]fa,int a,int b){
int c=find(fa,b);
fa[c]=find(fa,a);
}
public int find(int[]fa,int a){
if(fa[a]==a)return a;
return fa[a]=find(fa,fa[a]);
}
public int largestComponentSize(int[] nums) {
int max=-1;
for(int c:nums)max=Math.max(max,c);
int[]fa=new int[max+1];
for(int i=2;i<=max;i++)fa[i]=i;
for(int c:nums){
for(int i=2;i*i<=c;i++){
if(c%i==0){
merge(fa,c,i);
merge(fa,c,c/i);
}
}
}
int[]cnt=new int[max+1];
int res=1;
for(int c:nums){
int f=find(fa,c);
cnt[f]++;
res=Math.max(res,cnt[f]);
}
return res;
}
}
class Solution:
def merge(self,fa,a,b):
c=self.find(fa,b)
fa[c]=self.find(fa,fa[a])
def find(self,fa,a):
if fa[a]==a:
return a
fa[a]=self.find(fa,fa[a])
return fa[a]
def largestComponentSize(self, nums: List[int]) -> int:
m=max(nums)
fa=[i for i in range(0,m+1)]
for c in nums:
i=2
while i*i<=c:
if c%i==0:
self.merge(fa,c,i)
self.merge(fa,c,c//i)
i+=1
cnt=[0 for _ in range(0,m+1)]
res=1
for c in nums:
f=self.find(fa,c)
cnt[f]+=1
res=max(res,cnt[f])
return res