题意:

给一串数,每一个数代表图的一个节点,然后两个数之间有除1之外的公因数表示这两个节点之间有边相连,求最大连通图。

做法:

如果平方找数两两之间是否存在公因数肯定超时,如果要判断两个数是否有公因数,只需要判断有没有含有相同的素数就可以了。

那么我们可以对每一个数进行一个归类,含有2的数,含有3的数,含有5的数,含有7的数。。。等等

对于都含有公因子2的数,那么肯定都相连。对于含有3的数,肯定也都相连。那么2和3这个群体相不相连呢?就得看有没有公共元素,所以这其实是一个很基础的并查集的模型。

怎么样合并呢?如果有a,b两个元素,那么我们只需要定义这两个元素的最终父亲是两个父亲间最小的那一个就ok。

代码:

class Solution {
public:
int all_num = 100000;
int prime[100005];
int fa[100005];
void get_prime(){//得到所有的素数memset(prime,0,sizeof(prime));vector<int>ans;int len = 0;for(int i=2;i<=all_num;i++){if(!prime[i])ans.push_back(i),len++;for(int j=0;j<len&&ans[j]*i<=all_num;j++){prime[ans[j]*i] = 1;if(i%ans[j]==0)break;}}
}int get_father(int x){//路径压缩得到父亲while(fa[x]!=x){int f = fa[x];fa[x] = fa[f];x = f;}return x;
}void init(){for(int i=0;i<=all_num;i++)fa[i] = i;
}int largestComponentSize(vector<int>& A) {get_prime();init();int sz = A.size();for(int i=0;i<sz;i++){for(int d = 2;d*d<=A[i];d++){#如果遍历所有的素数会超时,因为素数有一万个。所以只能用根号的时间复杂度来遍历if(A[i]%d==0&&!prime[d]){int fa1 = get_father(A[i]);int fa2 = get_father(d);fa[fa1] = fa[fa2] = min(fa1,fa2);}if(A[i]%d==0&&!prime[A[i]%d]){int fa1 = get_father(A[i]);int fa2 = get_father(A[i]/d);fa[fa1] = fa[fa2] = min(fa1,fa2);}}}map<int,int>ma; //最后用一个map来找到最终最大的集团,因为这个集团所有人的父亲都是同一个。int mma = 0;for(int i=0;i<sz;i++){int fa1 = get_father(A[i]);ma[fa1] = ma[fa1] + 1;if(ma[fa1]>mma)mma = ma[fa1];}return mma;
}
};

leetcode 952. 按公因数计算最大组件大小 (素数筛法+并查集)相关推荐

  1. 952. 按公因数计算最大组件大小 : 枚举质因数 + 并查集运用题

    题目描述 这是 LeetCode 上的 952. 按公因数计算最大组件大小 ,难度为 困难. Tag : 「数学」.「并查集」 给定一个由不同正整数的组成的非空数组 nums,考虑下面的图: 有  n ...

  2. LeetCode 952. 按公因数计算最大组件大小

    952. 按公因数计算最大组件大小 [质因数+并查集]一开始我想的是两两用gcd查公因数,如果不是1就用并查集合并,但是复杂度O(n * n * gcd),O(gcd) = O(logm),所以显然是 ...

  3. LeetCode每日一题——952. 按公因数计算最大组件大小

    参考资料: https://leetcode.cn/problems/largest-component-size-by-common-factor/solution/an-gong-yin-shu- ...

  4. Leetcode-952 Largest Component Size by Common Factor(按公因数计算最大组件大小)

    一开始想法单纯,试了试并查集+GCD,果断TLE 73 实在想不出比O(n^2)更好的算法,所以偷瞄了大神的代码,如下 1 #include <iostream> 2 #include & ...

  5. LeetCode 886. 可能的二分法(着色DFS/BFS/拓展并查集)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 2.3 并查集 1. 题目 给定一组 N 人(编号为 1, 2, -, N), 我们想把每个人分进任意大小的两组. 每个人都可能不喜欢 ...

  6. LeetCode 1319. 连通网络的操作次数(BFS/DFS/并查集)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 2.3 并查集 1. 题目 用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1. 线缆用 connection ...

  7. leetcode 721. Accounts Merge | 721. 账户合并(HashMap版并查集)

    题目 https://leetcode.com/problems/accounts-merge/ 题解 HashMap 版的并查集.参考了:leetcode 684. Redundant Connec ...

  8. LeetCode 2092. 找出知晓秘密的所有专家(并查集)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号. 另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meeting ...

  9. LeetCode 1135. 最低成本联通所有城市(最小生成树+排序+并查集)

    文章目录 1. 题目 2. 解题 1. Kruskal 2. prim 1. 题目 想象一下你是个城市基建规划者,地图上有 N 座城市,它们按以 1 到 N 的次序编号. 给你一些可连接的选项 con ...

最新文章

  1. JUnit 3.8 通过反射测试私有方法
  2. datatables设置解析
  3. 销售组织与工厂对照表
  4. 大数据技术周报第 002 期
  5. 【Antlr】Antlr重写输入流
  6. 分布式配置中心-Disconf入门指南
  7. mysql jsp省市区三级联动_用jsp实现省市区三级联动下拉
  8. UML学习_2_参与者
  9. 章文嵩博士和他背后的负载均衡(LOAD BANLANCER)帝国
  10. 彻底解决NSEC病毒
  11. Edit plus | ecli pse配色方案
  12. 跨越专业翻译的语言之墙:百度翻译的技术攀登
  13. MEX and Increments-(先拿一些的贪心思维)
  14. 2021年西式面点师(初级)考试题库及西式面点师(初级)考试试题
  15. UED设计流程和方法
  16. 榜单发布!国产智能驾驶域控制器市场竞争力TOP10供应商
  17. login 登陆界面
  18. 计算机语言cobol,COBOL语言编译器
  19. jquery-chosen选择框插件零基础学习
  20. 读书笔记:----《动物庄园》

热门文章

  1. 比较 REST、JSON:API 和 GraphQL
  2. 解密DeFi中场,哪些项目会留下来​?
  3. 文件上传漏洞(一句话木马)-学习笔记
  4. 7-2 币值兑换 编程总结
  5. java楼盘管理系统_基于Java的楼盘销售管理系统的设计与实现
  6. Git与SVN冲突解决及特性对比
  7. C语言结构体定义的几种方法
  8. 2021金山前端实习生笔试
  9. proface如何安装数据穿越功能
  10. 水电厂计算机监控系统设计,水电厂计算机监控系统设计与实现