当前位置:网站首页>952. 按公因数计算最大组件大小 : 枚举质因数 + 并查集运用题
952. 按公因数计算最大组件大小 : 枚举质因数 + 并查集运用题
2022-07-30 17:09:00 【宫水三叶的刷题日记】
题目描述
这是 LeetCode 上的 952. 按公因数计算最大组件大小 ,难度为 困难。
Tag : 「数学」、「并查集」
给定一个由不同正整数的组成的非空数组 nums,考虑下面的图:
有 nums.length个节点,按从nums[0]到nums[nums.length - 1]标记;只有当 nums[i]和nums[j]共用一个大于 的公因数时,nums[i]和nums[j]之间才有一条边。
返回 图中最大连通组件的大小 。
示例 1: 
输入:nums = [4,6,15,35]
输出:4
示例 2: 
输入:nums = [20,50,9,63]
输出:2
示例 3: 
输入:nums = [2,3,6,7,4,12,21,39]
输出:8
提示:
nums中所有值都 不同
枚举质因数 + 并查集
先考虑如何使用 nums 进行建图,nums 大小为 ,枚举所有点对并通过判断两数之间是否存在边的做法复杂度为 (其中 为 的最大值),无须考虑。
而不通过「枚举点 + 求公约数」的建图方式,可以对 进行质因数分解(复杂度为 ),假设其分解出来的质因数集合为 ,我们可以建立从 到 的映射关系,若 与 存在边,则 和 至少会被同一个质因数所映射。
维护连通块数量可以使用「并查集」来做,维护映射关系可以使用「哈希表」来做。
维护映射关系时,使用质因数为 key,下标值 为 value(我们使用下标 作为点编号,而不是使用 ,是利用 各不相同,从而将并查集数组大小从 收窄到 )。
同时在使用「并查集」维护连通块时,同步维护每个连通块大小 sz 以及当前最大的连通块大小 ans。
Java 代码:
class Solution {
static int N = 20010;
static int[] p = new int[N], sz = new int[N];
int ans = 1;
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void union(int a, int b) {
if (find(a) == find(b)) return ;
sz[find(a)] += sz[find(b)];
p[find(b)] = p[find(a)];
ans = Math.max(ans, sz[find(a)]);
}
public int largestComponentSize(int[] nums) {
int n = nums.length;
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < n; i++) {
int cur = nums[i];
for (int j = 2; j * j <= cur; j++) {
if (cur % j == 0) add(map, j, i);
while (cur % j == 0) cur /= j;
}
if (cur > 1) add(map, cur, i);
}
for (int i = 0; i <= n; i++) {
p[i] = i; sz[i] = 1;
}
for (int key : map.keySet()) {
List<Integer> list = map.get(key);
for (int i = 1; i < list.size(); i++) union(list.get(0), list.get(i));
}
return ans;
}
void add(Map<Integer, List<Integer>> map, int key, int val) {
List<Integer> list = map.getOrDefault(key, new ArrayList<>());
list.add(val);
map.put(key, list);
}
}
TypeScript 代码:
const N = 20010
const p: number[] = new Array<number>(N), sz = new Array<number>(N)
let ans = 0
function find(x: number): number {
if (p[x] != x) p[x] = find(p[x])
return p[x]
}
function union(a: number, b: number): void {
if (find(a) == find(b)) return
sz[find(a)] += sz[find(b)]
p[find(b)] = p[find(a)]
ans = Math.max(ans, sz[find(a)])
}
function largestComponentSize(nums: number[]): number {
const n = nums.length
const map: Map<number, Array<number>> = new Map<number, Array<number>>()
for (let i = 0; i < n; i++) {
let cur = nums[i]
for (let j = 2; j * j <= cur; j++) {
if (cur % j == 0) add(map, j, i)
while (cur % j == 0) cur /= j
}
if (cur > 1) add(map, cur, i)
}
for (let i = 0; i < n; i++) {
p[i] = i; sz[i] = 1
}
ans = 1
for (const key of map.keys()) {
const list = map.get(key)
for (let i = 1; i < list.length; i++) union(list[0], list[i])
}
return ans
};
function add(map: Map<number, Array<number>>, key: number, val: number): void {
let list = map.get(key)
if (list == null) list = new Array<number>()
list.push(val)
map.set(key, list)
}
时间复杂度: 空间复杂度:
最后
这是我们「刷穿 LeetCode」系列文章的第 No.952 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地
本文由 mdnice 多平台发布
边栏推荐
猜你喜欢

BCryptPasswordEncoder的使用及原理

新零售saas小程序如何探索数字化门店的破局之路?

PHP message feedback management system source code

基于stm32的shell实现

Discuz magazine/news report template (jeavi_line) UTF8-GBK template

关于内和调试无法查看ntdll内存的问题

代码越写越乱?那是因为你没用责任链

MySQL详细学习教程(建议收藏)

C# 连接SQL Sever 数据库与数据查询实例 数据仓库

Error occurred while trying to proxy request The project suddenly can't get up
随机推荐
Lotus explodes the block failed
真正懂经营管理的CIO具备哪些特质
JMeter笔记3 | JMeter安装和环境说明
京东获取推荐商品列表 API
JMeter笔记4 | JMeter界面介绍
Chapter 5 Advanced SQL Processing
论文阅读之《Quasi-Unsupervised Color Constancy 》
Shell implementation based on stm32
优酷视频元素内容召回系统:多级多模态引擎探索
Mirror stand to collect
Google Cloud Spanner的实践经验
C# 连接SQL Sever 数据库与数据查询实例 数据仓库
[HarekazeCTF2019] Avatar Uploader 1
FP6600QSO SOP-8 USB专用充电端口控制器 用于快充电协议和QC2.0/3.0
lotus 爆块失败
简易的命令行入门教程
数据库课程设计大作业大盘点【建议在校生收藏】
data storage
MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单
Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)