
LC并查集
并查集
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
LeetCode 305. 岛屿数量 II (并查集)
305. 岛屿数量 II最暴力的做法其实就是,加一个点,统计一次。好的做法就是使用并查集。class UnionFind { int[] f; int N; int n,m; public UnionFind(int n) { N = n+10; f = new int[N]; for(int i=0;i<N;i++) f[i] = i; } public UnionFind() {原创 2021-02-01 16:55:29 · 185 阅读 · 0 评论 -
LeetCode 323. 无向图中连通分量的数目
无向图中连通分量的数目例题难度。class UnionFind { int[] f; int N; public UnionFind(int n) { N = n+10; f = new int[N]; for(int i=0;i<N;i++) f[i] = i; } public UnionFind() { this((int)5e5); } int find(int原创 2021-02-01 16:37:48 · 299 阅读 · 0 评论 -
LeetCode 1722. 执行交换操作后的最小汉明距离 ( 并查集 + 哈希表(排序+双指针)) )
1722. 执行交换操作后的最小汉明距离思路:并查集合并联通分量统计每个联通分量的不同的数字的个数class UnionFind { int[] f; int N; public UnionFind(int n) { N = n+10; f = new int[N]; for(int i=0;i<N;i++) f[i] = i; } public UnionFind() { thi原创 2021-02-01 16:34:11 · 141 阅读 · 0 评论 -
LeetCode 1101. 彼此熟识的最早时间 (排序、并查集)
1101. 彼此熟识的最早时间class UnionFind { int[] f; int N; int cnt = 0; public UnionFind(int n) { N = n+10; f = new int[N]; for(int i=0;i<N;i++) f[i] = i; } public UnionFind() { this((int)5e5); }原创 2021-02-01 15:47:22 · 154 阅读 · 0 评论 -
LeetCode 839. 相似字符串组 (暴力+并查集)
相似字符串组class UF{ int[] f; UF(int n){ f = new int[n+10]; for(int i=1;i<n+10;i++) f[i] = i; } int find(int x){ return x==f[x]?x:(f[x] = find(f[x])); } void merge(int x,int y){ f[find(x)] = fin原创 2021-01-31 13:36:10 · 125 阅读 · 0 评论 -
LeetCode 1579. 保证图可完全遍历 (贪心 + 并查集)
1579. 保证图可完全遍历贪心优先使用类型为3的边去合并连通分量。并查集维护连通分量,并记录使用过的边。public class UnionFindSet { int[] f; int N, cnt; public int find(int x){ return x==f[x]?x:(f[x] = find(f[x])); } public boolean merge(int x,int y) { int fx =原创 2021-01-27 15:37:45 · 121 阅读 · 0 评论 -
LeetCode 959. 由斜杠划分区域 ( 建模、并查集)
959. 由斜杠划分区域这题主要是建模困难。具体的看下面这张图就可以了。public class UnionFindSet { int[] f; int N; public int find(int x){ return x==f[x]?x:(f[x] = find(f[x])); } public void merge(int x,int y) { int fx = find(y); int fy = find原创 2021-01-25 15:37:45 · 124 阅读 · 0 评论 -
LeetCode 803. 打砖块 ( 并查集对连通分量的维护、 逆向思维)
803 打砖块并查集很容易处理连通分量的合并,却不适合处理分裂。所以逆向操作。const int N = 4e4+10;const int dx[4] = {1,0,-1,0};const int dy[4] = {0,1,0,-1};struct UF{ int f[N]; int sz[N] = {0}; UF(){ for(int i=0;i<N;i++) f[i] = i; } int find(int x){原创 2021-01-16 20:50:01 · 127 阅读 · 0 评论 -
LeetCode 399. 除法求值(边带权并查集、DFS、建图、字符串映射)
除法求值class Solution {public: map<string,int> m; double graph[1010][1010] = {0}; bool g[1010][1010] = {0},vis[1010] = {0}; int cnt = 0; vector<double> calcEquation(vector<vector<string>>& equations, vector<原创 2020-06-05 17:50:14 · 193 阅读 · 0 评论 -
LeetCode 685. 冗余连接 II(有向图的环) 并查集+出度、入度的分类讨论
冗余连接 IIstruct UFS{ int f[1010]; int count; UFS(){ for(int i=1;i<1010;i++){ f[i] = i; } } int find(int x){ return x==f[x]?x:f[x]=find(f[x]); } void merge(int x,int y) { if(find(x)=原创 2020-06-04 18:54:01 · 762 阅读 · 0 评论 -
LeetCode 721. 账户合并 (并查集、字符串处理、善用STL | Collection)
账户合并这题仍然就是并查集的基本操作,难点在于建模困难,怎么将这个账户、邮箱合并的问题转换为最原始的并查集问题。如何建模:① 将username进行1~n的编号,username才是我们并查集要处理的元素对象,而不是邮箱。② 利用map<string,int>将每一个邮箱地址字符串映射到它的用户名,也就是上面的1~n。③ 如果邮箱字符串发生了重复,将当前邮箱的用户i和与它重复的字符串的用户j 进行并查集的合并操作。④ 最终,一共有多少个不同的并查集,就有多少个不同的用户。遍历1~n,原创 2020-06-04 18:34:31 · 255 阅读 · 0 评论 -
LeetCode 1319. 连通网络的操作次数(并查集维护连通性,求不同并查集的个数)
连通网络的操作次数一开始求错了,求的是一共能多出多少剩余的线缆可供使用求出这个网络的连通块的数量,数量减1就是答案。struct UFS{ int f[100010]; UFS(){ for(int i=0;i<100010;i++){ f[i] = i; } } int find(int x){ return x==f[x]?x:f[x]=find(f[x]); } void原创 2020-06-03 01:30:38 · 222 阅读 · 1 评论 -
LeetCode 684. 冗余连接(树+冗余边成环)并查集求冗余边
冗余连接运行时间排名不太好。大体思路:①先用并查集求出环中的某一个点,依次作为搜索的起点:成环的要求:要merge的两个节点,它们已经在一个并查集里面了。ufs.find(y)==ufs.find(x)②用上面求出的根节点作为搜索起点,dfs遍历整棵树。注意不能走回头路。③当再次搜索到根节点的时候,说明成环,立即结束递归。④为了方便最后的查询(O(log n)),用set记录下搜索路径上的点,回溯时,注意删除。⑤最后逆序遍历题给的边集,若边的两个点,都在集合里,输出。整体时间复原创 2020-06-02 20:19:25 · 243 阅读 · 0 评论 -
LeetCode 1202. 交换字符串中的元素 (并查集维护字符连通块+字典序)
交换字符串中的元素不知道,时间排名总是很靠后啊这个题目主要就是要意识到一点,一个连通块中的所有字符都可以通过n多次排序,达到最后是字典序的效果。下面就是并查集的一般做法了。struct UFS{ int f[100010]; UFS(){ for(int i=0;i<100010;i++){ f[i] = i; } } int find(int x){ return x==f[x]?x:f[原创 2020-06-01 17:14:06 · 292 阅读 · 0 评论 -
LeetCode 547.朋友圈 (并查集+DFS)
朋友圈 并查集模板题struct UFS{ int f[210]; UFS(){ for(int i=0;i<210;i++){ f[i] = i; } } int find(int x){ return x==f[x]?x:f[x]=find(f[x]); } void merge(int x,int y){ f[find(x)] = find(y);原创 2020-06-01 15:50:45 · 200 阅读 · 0 评论 -
LeetCode 990.等式方程的可满足性 (并查集+ DFS解法)
等式方程的可满足性基本上就是并查集的模板题。struct UFS{ int f[200]; UFS(){ for(int i=95;i<=130;i++){ f[i] = i; } } void merge(int x,int y){ f[find(x)] = find(y); } int find(int x){ return x==f[x]?x:f[x] =原创 2020-05-31 01:12:27 · 298 阅读 · 0 评论 -
LeetCode 947. 移除最多的同行或同列石头(并查集)
自己的代码:一开始是每两个点进行合并,时间复杂度O(NN),果然超时,然后用O(N)开销。记录下横坐标相同的点,纵坐标相同的点。在随机数据下,时间复杂度近似为O(N)。但是如果所有的点都在同一行上,时间复杂度仍为O(NN)。移除最多的同行或同列石头struct UFS{ int f[1010]; UFS(int n){ for(int i=0;i<=n+1;i++){ f[i] = i; } } int原创 2020-05-30 23:34:03 · 357 阅读 · 0 评论 -
LeetCode 面试题 17.07婴儿名字 (并查集+字符串处理+字典序)
婴儿名字1600ms,吐了 ,代码看似很长。但主要花在了字符串处理上。string s;s.substring(int idx,int len); //去除子串stoi(string s); //将s的值换算10进制整数s.find(string target); //得到目标字符串的匹配的位置。struct Node{ int ID; string name; int num; Node(string name,int num):name(name),n原创 2020-05-30 19:20:36 · 326 阅读 · 0 评论