当前位置:网站首页>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 多平台发布
边栏推荐
- 对话框 QDialog ( 详解 )
- 优酷视频元素内容召回系统:多级多模态引擎探索
- Win11如何把d盘空间分给c盘?Win11d盘分盘出来给c盘的方法
- Invalid or corrupt jarfile xxx.jar
- PHP留言反馈管理系统源码
- MySQL超详细安装教程 手把手教你安装MySQL到使用MySQL 最简单的MySQL安装方式,这种方式装,卸载也简单
- 新零售saas小程序如何探索数字化门店的破局之路?
- Excel导入和导出
- Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)
- Error EPERM operation not permitted, mkdir 'Dsoftwarenodejsnode_cache_cacach Two solutions
猜你喜欢

华为云数据治理生产线DataArts,让“数据'慧'说话”

S7-200SMART中定时器的使用方法和常见注意事项汇总

说几个大厂分库分表的那点破事。

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

疫情之下的裁员浪潮,7点建议帮你斩获心仪offer

哎,这要人老命的缓存一致问题啊

bean的生命周期

Insert data into MySQL in C language

Summary of String Copy, Concatenation, Comparison and Split Functions (1)

Security business revenue growth rate exceeds 70% 360 builds digital security leader
随机推荐
Lotus 1.16.0 minimum snapshot export import
Google earth engine如何实现我们时间列表的排列和选取
Shell implementation based on stm32
web服务通过用户访问请求判断设备来源
大批程序员可能面临被劝退!
592. Fraction Addition and Subtraction
SYSCALL SWAPGS
Gvim order record
[Geek Challenge 2020] Roamphp1-Welcome
KDD‘21推荐系统离散特征表征无embedding table Learning to Embed Categorical Features without Embedding Tables for
哎,这要人老命的缓存一致问题啊
Error EPERM operation not permitted, mkdir 'Dsoftwarenodejsnode_cache_cacach Two solutions
Mirror stand to collect
论文阅读之《Quasi-Unsupervised Color Constancy 》
MySql统计函数COUNT详解
Discuz杂志/新闻报道模板(jeavi_line)UTF8-GBK模板
OpenCV形状检测
LeetCode318: Maximum product of word lengths
torch.optim.Adam() 函数用法
esp32系列(5):esp32 蓝牙架构学习