952

思路:并查集+因数分解

  • 将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

 

posted @ 2022-07-30 10:54  kris-phl  阅读(12)  评论(0)    收藏  举报