题目描述

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

有 nums.length 个节点,按从 nums[0] 到 nums[nums.length - 1] 标记;

只有当 nums[i] 和 nums[j] 共用一个大于 1 的公因数时,nums[i] 和 nums[j]之间才有一条边。

返回 图中最大连通组件的大小 。

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/largest-component-size-by-common-factor

提示:

1 <= nums.length <= 2 * 10^4

1 <= nums[i] <= 10^5

nums 中所有值都 不同

题目分析

最直接的想法是去遍历数组中的每一个数num。对于每一个数,可以考查其所有因子,并使用并查集将因子与这个数本身归为一个集合中,在这个过程中,数组中具有大于1的num之间也会被合并入相同的集合。最后,我们可以重新遍历nums数组,并通过并查集查询每个num对应的root,并统计对应的频次,保留最大的频次,就可以得到最大联通组件的大小。

代码

golang
type Union struct {
parent, rank []int
//rank按秩合并
} func newUnion(n int) Union {
parent := make([]int, n)
for i := range parent {
parent[i] = i
}
return Union{parent, make([]int, n)}
} func (u Union) find(x int) int {
if u.parent[x] != x {
//路径压缩
u.parent[x] = u.find(u.parent[x])
}
return u.parent[x]
} func (u Union) merge(x int, y int) {
rootX := u.find(x)
rootY := u.find(y)
if rootX != rootY {
if u.rank[rootY] > u.rank[rootX] {
u.parent[rootX] = rootY
} else if u.rank[rootY] > u.rank[rootX] {
u.parent[rootY] = rootX
} else {
u.parent[rootX] = rootY
//更新秩
u.rank[rootY]++
}
}
}
func max(x int, y int) int{
if x > y {
return x
}
return y
} func largestComponentSize(nums []int) int {
maxVal := 0
for _, num := range nums{
maxVal = max(num, maxVal)
}
union := newUnion(maxVal +1)
for _, num := range nums{
//暴力筛
for i := 2; i * i <= num; i++{
if num % i == 0{
union.merge(num, i)
union.merge(num, num/i)
}
}
}
rtn := 0
arr := make([]int, maxVal+1)
for _, num := range nums{
root := union.find(num)
arr[root] ++
rtn = max(rtn, arr[root])
}
return rtn
}

[LC952]按公因数计算最大组件大小的更多相关文章

  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. QuantLib 金融计算——基本组件之 InterestRate 类

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

  3. 【Java布局】FlowLayout布局时设定组件大小

    默认的JPanel中,采用的是FlowLayout布局 下面是api中的定义: JPanel(boolean isDoubleBuffered)           创建具有 FlowLayout 和 ...

  4. ios UITextView 计算文字内容大小

    先设置好 textView的内容文字,再调用以下代码,就能够得到文字内容的size,其中参数表示最大的size的尺寸,通常,高度应该不限制,宽度是控件的宽度. let newSize = statem ...

  5. 【转】Android绘制View的过程研究——计算View的大小

    Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/18182725720121023218 ...

  6. iOS计算缓存文件的大小

    //获取缓存文件路径 -(NSString *)getCachesPath{ // 获取Caches目录路径 NSArray *paths = NSSearchPathForDirectoriesIn ...

  7. PHP计算某个目录大小的方法

    用PHP来计算某个目录大小的方法. PHP CURL session COOKIE  可以调用系统命令,还可以这样:  <?php function dirsize($dir) {  @$dh  ...

  8. python计算文件夹大小(linux du命令 简化版)

    C盘又满了,怎么办?用了一些垃圾清理软件(或者bat脚本),但是还是不理想,那么具体哪些文件夹下面有巨大的文件呢?windows并不能通过详细信息看到每个文件夹的大小(PS:这里所谓的文件夹的大小是指 ...

  9. Python_计算文件夹大小

    计算文件夹大小 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.path.join(path1[, path2[, ...]]) 将 ...

  10. ios 拉伸图片和计算文字的大小

    一.拉伸图片 /** * 传入图片的名称,返回一张可拉伸不变形的图片 * * @param imageName 图片名称 * * @return 可拉伸图片 */ + (UIImage *)resiz ...

随机推荐

  1. Linux利用scp命令上传下载文件

    scp是secure copy的简写,用于在 Linux 下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. scp传输是加密的,可能会稍微影响一下速度.当你服务 ...

  2. 什么是AOP面向切面编程?怎么简单理解?

    本文原文地址:什么是AOP面向切面编程?怎么简单理解? 什么是AOP面向切面编程 面向切面编程(AOP)通过将横切关注点(cross-cutting concerns)分离出来,提供了一种增强代码模块 ...

  3. 使用wxpython开发跨平台桌面应用,对WebAPI调用接口的封装

    我在前面介绍的系统界面功能,包括菜单工具栏.业务表的数据,开始的时候,都是基于模拟的数据进行测试,数据采用JSON格式处理,通过辅助类的方式模拟实现数据的加载及处理,这在开发初期是一个比较好的测试方式 ...

  4. jquery datatable 全选,反选 参考文档

    1 版本号 DataTables 1.10.12 2 API文档地址 http://datatables.club/reference/option/ 官方option http://datatabl ...

  5. ABP —— 权限管理

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 完成了简单的增删改查和分页功能,是不是觉得少了点什么?是的,少了权限管理.既然涉及到了权限,那我们 ...

  6. git clone 远程代码执行漏洞(CVE-2024-32002) 升级

    接到提醒说git有个漏洞,Git clone 远程代码执行漏洞(CVE-2024-32002) 看了看,说是git的Symlinks模块存在高危漏洞,攻击者可以利用该漏洞执行任意代码,导致服务器失陷. ...

  7. Nuxt.js 应用中的 webpack:done 事件钩子

    title: Nuxt.js 应用中的 webpack:done 事件钩子 date: 2024/11/26 updated: 2024/11/26 author: cmdragon excerpt: ...

  8. Python 潮流周刊#79:Python 的元数据困境(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  9. sql注入-数据库表基本操作

    一.数据库 linux下登录: mysql -u root -p 查看数据库: show databases; 可以在phpmyadmin面板点击SQL进行操作 1. 增加/创建 创建xxx数据库,并 ...

  10. 从底层源码深入分析Spring的IoC容器初始化过程

    IOC容器的初始化整体过程 Spring是如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的?这主要会经过以下 4 步: 从XML中读取配置文 ...