2021-08-02:按公因数计算最大组件大小。给定一个由不同正整数的组成的非空数组 A,考虑下面的图:有 A.length 个节点,按从 A[0] 到 A[A.length - 1] 标记;只有当 A[i] 和 A[j] 共用一个大于 1 的公因数时,A[i] 和 A[j] 之间才有一条边。返回图中最大连通组件的大小。

福大大 答案2021-08-02:

算出每个的公因数,然后并查集。
时间复杂度: O(N*sqrt(V))。
空间复杂度: O(N)。

代码用golang编写。代码如下:

package main

import (
"fmt"
"math"
) func main() {
arr := []int{2, 3, 6, 7, 4, 12, 21, 39}
ret := largestComponentSize2(arr)
fmt.Println(ret)
}
func largestComponentSize2(arr []int) int {
N := len(arr)
// arr中,N个位置,在并查集初始时,每个位置自己是一个集合
unionFind := NewUnionFind(N)
// key 某个因子 value 哪个位置拥有这个因子
fatorsMap := make(map[int]int)
for i := 0; i < N; i++ {
num := arr[i]
// 求出根号N, -> limit
limit := int(math.Sqrt(float64(num)))
for j := 1; j <= limit; j++ {
if num%j == 0 {
if j != 1 { if _, ok := fatorsMap[j]; !ok {
fatorsMap[j] = i
} else {
unionFind.union(fatorsMap[j], i)
}
}
other := num / j
if other != 1 {
if _, ok := fatorsMap[other]; !ok {
fatorsMap[other] = i
} else {
unionFind.union(fatorsMap[other], i)
}
}
}
}
}
return unionFind.maxSize()
} // O(1)
// m,n 要是正数,不能有任何一个等于0
func gcd(a int, b int) int {
if b == 0 {
return a
} else {
return gcd(b, a%b)
}
} type UnionFind struct {
parents []int
sizes []int
help []int
} func NewUnionFind(N int) *UnionFind {
res := &UnionFind{}
res.parents = make([]int, N)
res.sizes = make([]int, N)
res.help = make([]int, N)
for i := 0; i < N; i++ {
res.parents[i] = i
res.sizes[i] = 1
}
return res
} func (this *UnionFind) maxSize() int {
ans := 0
for _, size := range this.sizes {
ans = getMax(ans, size)
}
return ans
} func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
} func (this *UnionFind) find(i int) int {
hi := 0
for i != this.parents[i] {
this.help[hi] = i
hi++
i = this.parents[i]
}
for hi--; hi >= 0; hi-- {
this.parents[this.help[hi]] = i
}
return i
} func (this *UnionFind) union(i int, j int) {
f1 := this.find(i)
f2 := this.find(j)
if f1 != f2 {
big := twoSelectOne(this.sizes[f1] >= this.sizes[f2], f1, f1)
small := twoSelectOne(big == f1, f2, f1)
this.parents[small] = big
this.sizes[big] = this.sizes[f1] + this.sizes[f2]
}
} func twoSelectOne(c bool, a int, b int) int {
if c {
return a
} else {
return b
}
}

执行结果如下:


左神java代码

2021-08-02:按公因数计算最大组件大小。给定一个由不同正整数的组成的非空数组 A,考虑下面的图:有 A.length 个节点,按从 A[0] 到 A[A.length - 1] 标记;只有当的更多相关文章

  1. [Swift]LeetCode952. 按公因数计算最大组件大小 | Largest Component Size by Common Factor

    Given a non-empty array of unique positive integers A, consider the following graph: There are A.len ...

  2. Mac下面的SecureCRT(附破解方案) 更新到最新的8.0.2

    继续更新到8.0.2的破解,整体的破解方案都发生了的变化首先还是去 http://macabc.com/detail.htm?app_id=24 下载最新的8.0.2介于很多小白说替换之后说文件损坏, ...

  3. 转载-Mac下面的SecureCRT(附破解方案) 更新到最新的8.0.2

    原帖地址:http://bbs.feng.com/read-htm-tid-6939481.html,爱死楼主了,哈哈 真心感谢 继续更新到8.3.0的破解,整体的破解方案都发生了的变化首先还是去ht ...

  4. QuantLib 金融计算——基本组件之 Currency 类

    目录 QuantLib 金融计算--基本组件之 Currency 类 概述 构造函数 成员函数 如果未做特别说明,文中的程序都是 python3 代码. QuantLib 金融计算--基本组件之 Cu ...

  5. QuantLib 金融计算——基本组件之 DayCounter 类

    目录 QuantLib 金融计算--基本组件之 DayCounter 类 DayCounter 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. QuantLi ...

  6. QuantLib 金融计算——基本组件之 Index 类

    目录 QuantLib 金融计算--基本组件之 Index 类 QuantLib 金融计算--基本组件之 Index 类 Index 类用于表示已知的指数或者收益率,例如 Libor 或 Shibor ...

  7. QuantLib 金融计算——基本组件之 InterestRate 类

    目录 QuantLib 金融计算--基本组件之 InterestRate 类 InterestRate 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. Qua ...

  8. QuantLib 金融计算——基本组件之 ExchangeRateManager 类

    目录 QuantLib 金融计算--基本组件之 ExchangeRateManager 类 概述 Money 类中的汇率转换配置 ExchangeRateManager 函数 如果未做特别说明,文中的 ...

  9. QuantLib 金融计算——基本组件之 ExchangeRate 类

    目录 QuantLib 金融计算--基本组件之 ExchangeRate 类 概述 构造函数 成员函数 如果未做特别说明,文中的程序都是 python3 代码. QuantLib 金融计算--基本组件 ...

  10. 2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割)

    2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割) https://www.luogu.com.cn/problem/P4001 题意: 把图分成两部分需要的最 ...

随机推荐

  1. c# form-data表单提交,post form上传数据、文件

    引用自:https://www.cnblogs.com/DoNetCShap/p/10696277.html 表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipa ...

  2. 《MySQL是怎样运行的》第五章小结

  3. SpringBoot笔记--Failed to read candidate component class报错的解决

    问题解决 形成该错误的原因就是Spring依赖和我们所使用的JDK版本不匹配 更详细一点的话,要解决这个问题,我们就需要升高Spring版本或者降低JDK版本即可解决 否则不能够在网页里面找到Tomc ...

  4. “==” 与 equals 区别 简化易懂版

    首先,我们只需要看Object中的equals 方法写的是啥 很显然,就是一句话,"==" 与 equals方法作用完全一致. 都是用来比较在内存的首地址,即用来比较两个引用变量是 ...

  5. LeetcodePractice-数组

    目录 88. 合并两个有序数组 思路解析 字节&1. 两数之和 思路解析 腾讯&15. 三数之和 思路解析 18. 四数之和 思路解析 解释下,tmpSum为什么用int不行,需要用i ...

  6. K8S安全学习

    k8s安全学习 一.云 云的定义看似模糊,但本质上,它是一个用于描述全球服务器网络的术语,每个服务器都有一个独特的功能.云不是一个物理实体,而是一个庞大的全球远程服务器网络,它们连接在一起,旨在作为单 ...

  7. Java面试——数据库

    一.数据库隔离级别 [1]Read Uncommitted(读取未提交内容):出现脏读,也就是可能读取到其他会话中未提交事务修改的数据.[2]Read Committed(读取已提交内容):不可重复读 ...

  8. 非常强大实用的键盘改键工具 - MapKeyboard

    MapKeyboard可以重新定义键盘上的键位,对于使用笔记本或非标准101键盘的用户来说,是一个很有用的键盘改键工具.当你重新定义完键位,改变将被明显的标注出来,即使重启也不会改变.它不需安装,也可 ...

  9. Java中使用List的add方法后元素相同问题

    在写JavaWeb时,我在后端通过JDBC读取了数据后逐个使用List.add()方法添加元素并通过request方法传给jsp页面解析,但是添加以后出现了在列表里有n个(假设添加了n个元素)最后一个 ...

  10. Flutter中如何取消任务

    前言 在开发过程中,取消需求是很常见的,但很容易被忽略.然而,取消需求的好处也很大.例如,在页面中会发送很多请求.如果页面被切走并处于不可见状态,就需要取消未完成的请求任务.如果未及时取消,则可能会导 ...