当前位置:网站首页>LeetCode 952. 按公因数计算最大组件大小
LeetCode 952. 按公因数计算最大组件大小
2022-08-03 19:03:00 【Sasakihaise_】

【质因数+并查集】一开始我想的是两两用gcd查公因数,如果不是1就用并查集合并,但是复杂度O(n * n * gcd),O(gcd) = O(logm),所以显然是超时的。
换种思路,可以求每个数的所有约数,然后以约数为key,以数的list为value存到哈希表中,每次把相同key的list下的数合并到并查集中这样复杂度只有O(n * logm),另外发现nums各不相同因此可以进行离散化把[1, 10^5]映射到[1, 2 * 10^4]上,也就是list中存数组的下标,并查集中也是合并元素下标。
求质因数可以这么写:
for(i = 2; i * i <= n; i++) {
if (n * i == 0) i-> yes;
while (n % i == 0) n /= i; // 把这个因数除干净
}
if(n != 1) n-> yes; //最后千万别忘了把最终得到的n加上
class Solution {
public:
int N = (int)2e4 + 1;
int *f;
int *d;
int ans = 1;
int ask(int x) {
return x == f[x]? x: ask(f[x]);
}
void merge(int x, int y) {
x = ask(x);
y = ask(y);
if (x == y) return;
d[x] += d[y];
f[y] = f[x];
ans = max(d[x], ans);
}
int largestComponentSize(vector<int>& nums) {
int n = nums.size();
f = (int*)malloc(sizeof(int) * N);
d = (int*)malloc(sizeof(int) * N);
unordered_map<int, vector<int>> m;
for (auto i = 0; i < N; i++) f[i] = i;
for (auto i = 0; i < N; i++) d[i] = 1;
for (auto i = 0; i < n; i++) {
int x = nums[i];
for (auto j = 2; j * j <= x; j++) {
if (x % j == 0) m[j].push_back(i);
while (x % j == 0) x /= j;
}
if (x != 1) m[x].push_back(i);
}
for (auto & it: m) {
vector<int> l = it.second;
int tmp = l.size();
for (auto i = 1; i < tmp; i++) {
merge(l[i - 1], l[i]);
}
}
return ans;
}
};class Solution {
// 并查集 10:31 13
int N = 20001;
int[] f = new int[N];
int[] cnt = new int[N];
int ans = 1;
int gcd(int a, int b) {
return a % b == 0? b: gcd(b, a % b);
}
int ask(int x) {
return x == f[x]? x: ask(f[x]);
}
void union(int x, int y) {
x = ask(x); y = ask(y);
if (x == y) return;
cnt[x] += cnt[y];
f[y] = x;
ans = Math.max(ans, cnt[x]);
}
public int largestComponentSize(int[] nums) {
for (var i = 0; i < N; i++) f[i] = i;
Arrays.fill(cnt, 1);
int n = nums.length;
Map<Integer, List<Integer>> map = new HashMap<>();
for (var i = 0; i < n; ++i) {
var x = nums[i];
for (var j = 2; j * j <= x; j++) {
if (x % j == 0) {
map.computeIfAbsent(j, k -> new ArrayList()).add(i);
}
while (x % j == 0) x /= j;
}
if (x != 1)
map.computeIfAbsent(x, k -> new ArrayList()).add(i);
}
for (var k: map.keySet()) {
var list = map.get(k);
int m = list.size();
for (var i = 1; i < m; i++) {
union(list.get(i - 1), list.get(i));
}
}
return ans;
}
}
边栏推荐
- 丙二醇二乙酸酯(Propylene Glycol Diacetate)
- 技术开发人员常用的安全浏览器
- ImportError: /lib/libgdal.so.26: undefined symbol: sqlite3_column_table_name
- 开发即时通讯到底需要什么样的技术,需要多久的时间
- 懵逼!阿里一面被虐了,幸获内推华为技术四面,成功拿到offer,年薪40w
- 高等数学---第十章无穷级数---常数项级数
- YAML中多行字符串的配置方法:|+、 |、 |-、 >+、 >、 >-的区别
- 2022年最新的Android面试大厂必考174题(附带详细答案)
- MySQL如何一劳永逸的永久支持输入中文
- Arduino实验三:继电器实验
猜你喜欢

How does MySQL permanently support Chinese input once and for all?

Difference差分数组

MYSQL误删数据恢复

图像超分——Real-ESRGAN快速上手

阿里巴巴政委体系-第七章、阿里政委培育

MySQL【变量、流程控制与游标】

U-Net生物医学图像分割讲解(Convolutional Networks for BiomedicalImage Segmentation)

Don't look down upon the WebSocket!Long connection, stateful, two-way, full-duplex king is Fried

awk语法-02-运算、数组、格式化输出

阿里巴巴政委体系-第五章、阿里政委体系建设
随机推荐
【HCIP】MPLS实验
cocos creater 3.x 插件安装方法
选出表中的中位数记录[构造左右边界 || 问题转换]
idea——同一项目开启多个实例(不同端口)
When does MySQL use table locks and when to use row locks?You should know this
阿里资深专家打造从零开始学架构,含阿里内部技术栈PPT、PFD实战
SQL代码需要供其他人复用,为什么传统的复制代码不可靠?
读取 resources 目录下的文件路径的九种方式,你知道多少?
技术开发人员常用的安全浏览器
X86函数调用模型分析
红日安全内网渗透靶场-VulnStack-1
普通用户如何利用小红书赚钱呢?小红书的流量是真的吗?
一文搞懂│php 中的 DI 依赖注入
软件测试回归案例,什么是回归测试?
阿里二面:多线程间的通信方式有几种?举例说明
货比四家 version tb1.63
MySQL如何 drop 大表
Web项目Controller统一返回实体类
[Notes] Introduction to machine learning
Oracle 脚本实现简单的审计功能