LeetCode 952. 按公因数计算最大组件大小(枚举因子+并查集)

题意:
给定一个由不同正整数的组成的非空数组 A,考虑下面的图:

有 A.length 个节点,按从 A[0] 到 A[A.length - 1] 标记;
只有当 A[i] 和 A[j] 共用一个大于 1 的公因数时,A[i] 和 A[j] 之间才有一条边。
返回图中最大连通组件的大小。

数据范围:
1 <= A.length <= 20000
1 <= A[i] <= 100000
解法:
对每个数质因子分解
用并查集将每个数和自己的所有>1的因子合并,统计连通块个数即可.
复杂度O(n*sq).
code:
const int maxm=1e5+5;
int pre[maxm],cnt[maxm];
int ffind(int x){
    return pre[x]==x?x:pre[x]=ffind(pre[x]);
}
class Solution {
public:
    void init(){
        for(int i=0;i<maxm;i++)pre[i]=i,cnt[i]=0;
    }
    int largestComponentSize(vector<int>& a){
        init();
        for(auto x:a)cnt[x]++;
        for(auto x:a){
            int f=ffind(x);
            for(int i=2;i*i<=x;i++){
                if(x%i==0){
                    int ff=ffind(i);
                    if(f!=ff){
                        pre[ff]=f;
                        cnt[f]+=cnt[ff];
                    }
                    //
                    int fff=ffind(x/i);
                    if(f!=fff){
                        pre[fff]=f;
                        cnt[f]+=cnt[fff];
                    }
                }
            }
        }
        int ans=0;
        for(int i=0;i<maxm;i++){
            ans=max(ans,cnt[i]);
        }
        return ans;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值