go语言完成按公因数计算最大组件大小

问题

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

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

示例

思想

设计并查集根据公共因子建立数字之间的关系,一般一个数字的因子不会大于它的平方根。所以在每个数的平方根内找公因子减少时间复杂度。

代码

import "math"
func largestComponentSize(nums []int) int {
    N := len(nums)
    F := new(FundUnion)
    F.Comstastor(N)
    fatherMap := make(map[int]int,0)
    for i:=0; i < N; i++{
        num := nums[i]
        limit := int(math.Sqrt(float64(num)))
        for j := 1; j<=limit; j++{
            if num % j == 0{
                if j != 1{
                    if _, ok := fatherMap[j]; !ok {
                        fatherMap[j] = i
                    }else {
                        F.union(fatherMap[j],i)
                    }
                }
                 other := num / j
                 if other != 1{
                     if _, ok := fatherMap[other]; !ok{
                         fatherMap[other] = i
                     }else {
                         F.union(fatherMap[other], i)
                     }
                 }
            }
        }
    }
    return F.maxSize()
}

type FundUnion struct{
    parents []int
    sizes []int
    helper []int
}
func (F *FundUnion)Comstastor(N int){
    F.parents = make([]int, N)
    F.sizes = make([]int, N)
    F.helper = make([]int, N)
    for i :=0; i < N; i++ {
        F.parents[i] = i
        F.sizes[i] = 1
    }
}
func (F *FundUnion) maxSize() int {
    ans := 0
    for _, value := range F.sizes {
        ans = max(value,ans)
    }
    return ans
}
func (F *FundUnion) find(x int) int{
    index := 0
    for x != F.parents[x]{
        F.helper[index] = x
        index++
        x = F.parents[x]
    }
    for index--; index >=0; index-- {
        F.parents[F.helper[index]] = x
    }
    return x
}
func (F *FundUnion) union(i int, j int){
    f1 := F.find(i)
    f2 := F.find(j)
    if f1 != f2 {
        var big int
        var small int
        if F.sizes[f1] > F.sizes[f2] {
            big = f1
        }else {
            big = f2
        }
        if big == f1{
            small = f2
        }else {
            small = f1
        }
        F.parents[small] = big
        F.sizes[big] = F.sizes[f1]+F.sizes[f2]
    }
}
func max(x int, y int) int {
    if x > y{
        return x
    }else {
        return y
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值