Leetcode-952 Largest Component Size by Common Factor(按公因数计算最大组件大小)
一开始想法单纯,试了试并查集+GCD,果断TLE 73
实在想不出比O(n^2)更好的算法,所以偷瞄了大神的代码,如下
1 #include <iostream> 2 #include <set> 3 #include <vector> 4 #define _for(i,a,b) for(int i = (a);i < (b);i ++) 5 6 using namespace std; 7 8 const int maxn = 100039; 9 set<int> g[maxn]; 10 vector<int> f[maxn]; 11 bool fvis[maxn] {0},gvis[maxn] {0}; 12 class Solution 13 { 14 public: 15 void demo(int x,int id) 16 { 17 for(int i = 2;i*i <= x;i ++) 18 { 19 if(!(x%i)) 20 { 21 f[id].push_back(i);//factor in vector 22 g[i].insert(id);//index in set 23 while(!(x%i)) x /= i; 24 } 25 } 26 if(x>1) 27 { 28 f[id].push_back(x);//factor in vector 29 g[x].insert(id);//index in set 30 } 31 } 32 void dfs(int id,set<int> &S) 33 { 34 fvis[id] = true; 35 S.insert(id); 36 for(auto fac:f[id]) 37 { 38 if(gvis[fac]) continue; 39 gvis[fac] = true; 40 for(auto fidx:g[fac]) 41 { 42 if(fvis[fidx]) continue; 43 S.insert(fidx); 44 dfs(fidx,S); 45 } 46 } 47 } 48 int largestComponentSize(vector<int>& A) 49 { 50 _for(i,0,A.size()) 51 demo(A[i],i); 52 int rnt = 1; 53 _for(i,0,A.size()) 54 { 55 set<int> tmp; 56 if(fvis[i]) continue; 57 dfs(i,tmp); 58 rnt = max(rnt,(int)tmp.size()); 59 } 60 return rnt; 61 } 62 }; 63 int main() 64 { 65 Solution obj; 66 vector<int> A {2,3,6,7,4,12,21,39}; 67 cout << obj.largestComponentSize(A) << endl; 68 return 0; 69 }
稍微解释一下,大神搞了一个双射,f里装的都是A[i]的因子,g里装的都是因子的下标,比如g[2]里装的就都是偶数的A的元素的下标,然后dfs vector f,走一遍因子,再根据因子从set g里找下标,每找到一个下标就装到set里,这其实就是一个"集",最后看看集的大小就是组件的大小,最大的集就是最大组件的大小
转载于:https://www.cnblogs.com/Asurudo/p/10054548.html
Leetcode-952 Largest Component Size by Common Factor(按公因数计算最大组件大小)相关推荐
- LeetCode 952. 按公因数计算最大组件大小
952. 按公因数计算最大组件大小 [质因数+并查集]一开始我想的是两两用gcd查公因数,如果不是1就用并查集合并,但是复杂度O(n * n * gcd),O(gcd) = O(logm),所以显然是 ...
- 952. 按公因数计算最大组件大小 : 枚举质因数 + 并查集运用题
题目描述 这是 LeetCode 上的 952. 按公因数计算最大组件大小 ,难度为 困难. Tag : 「数学」.「并查集」 给定一个由不同正整数的组成的非空数组 nums,考虑下面的图: 有 n ...
- LeetCode每日一题——952. 按公因数计算最大组件大小
参考资料: https://leetcode.cn/problems/largest-component-size-by-common-factor/solution/an-gong-yin-shu- ...
- leetcode 952. 按公因数计算最大组件大小 (素数筛法+并查集)
题意: 给一串数,每一个数代表图的一个节点,然后两个数之间有除1之外的公因数表示这两个节点之间有边相连,求最大连通图. 做法: 如果平方找数两两之间是否存在公因数肯定超时,如果要判断两个数是否有公因数 ...
- LeetCode——Kth Largest Element in an Array
LeetCode--Kth Largest Element in an Array Question Find the kth largest element in an unsorted array ...
- LeetCode 84. Largest Rectangle in Histogram
LeetCode 84. Largest Rectangle in Histogram Solution1:我的答案 循环里头套了一个动态规划,缺点是当heights个数或最大高度多高时会很耗时间!! ...
- LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字
2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetco ...
- 【回文串10】LeetCode 479. Largest Palindrome Product
LeetCode 479. Largest Palindrome Product 本博客转载自:http://www.cnblogs.com/grandyang/p/7644725.html Solu ...
- [LeetCode]179. Largest Number
[LeetCode]179. Largest Number 题目描述 解题思路 求最大的数,在数组中对于每一位数字数值越大应当越靠前,如:9 > 5,所以9应该在5之前 需要考虑的是对于不同位数 ...
最新文章
- java 线程池 分组_JAVA面试题解惑系列(十)——话说多线程
- android n AES加密,AndroidP AES 加密适配
- MySQL之长连接、短连接、连接池(转载:http://www.ywnds.com/?p=9801)
- input子系统基础之按键2——input设备应用层编程实践
- 泰克示波器查眼图_泰克示波器自带上位机软件功能介绍,了解一下
- linux mount 原文件夹,window文件夹mount挂载Linux
- 将你的掘金小册制作成一整本PDF
- matlab随机生成点图,matlab随机生成散点图
- Ubuntu 20.04 上安装使用 ibus-rime(超实用)
- 2012冬-我想和生活谈谈
- 【Matlab】变分法求控制器(无约束)
- 1.学生党如何查找文献书籍
- csgo社区服务器维护2021,CSGO国际服启动软件
- webstorm热更新
- 《零基础学HTML5+CSS3(全彩版)》读书笔记
- 微信小程序,后台数据返回的数据带有回车符,对文本进行回车符处理
- 数据库中的表类型和字段类型
- 基于反事实的因果推理Causal inference based on counterfactuals--一万六千字文献详细解读(因果关系的推理应用)【全文总结】
- 计算机控制技术课程配套教材习题解答(第4、5章)
- Python多线程爬虫实例
热门文章
- 现在有很多年轻人都不想打工
- OpenZeppelin集成Truffle编写健壮安全的合约
- Qt4_用DOM读取XML
- Qt4_在Qt设计师中集成自定义窗口部件
- TCP/IP参考模型和五层参考模型
- android新对象锁,Android的线程和对象锁定
- 使用备份和还原以及SMB协议将SQL数据库从Windows迁移到Linux
- SQL Server 2016中的本机JSON支持
- azure db 设置时区_使用Azure Cosmos DB开始您的旅程
- 如何在SQL Server中处理过多的SOS_SCHEDULER_YIELD等待类型值