![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
消灭猕猴桃
保持热爱,奔赴山海
展开
-
[leetCode]765. 情侣牵手
题目https://leetcode-cn.com/problems/couples-holding-hands/并查集阅读题目通过感觉可以知道是考察并查集,并查集并不难写,难得是题目得分析。通过举几个例子可以发现,最少得交换次数等于交换完成之后得连通分量个数减去交换之前的连通分量个数。class Solution { public int minSwapsCouples(int[] row) { int len = row.length; int N原创 2021-02-14 20:11:31 · 85 阅读 · 0 评论 -
[leetCode]200. 岛屿数量
dfs遍历二维网格,如果网格值为“1”则以该网格为起点进行深度优先遍历,在搜索过程中值为1的网格都置为“0”。这样深度优先搜索的次数就是岛屿的数量。class Solution { public int numIslands(char[][] grid) { int num = 0; int rows = grid.length; int cols = grid[0].length; for (int row = 0; row &.原创 2020-10-19 18:08:10 · 153 阅读 · 0 评论 -
[leetCode]839. 相似字符串组
题目https://leetcode-cn.com/problems/similar-string-groups/并查集由题目可知,只要两个字符串相似则它们属于同一个连通分量,可以通过并查集维护连通分量的个数,最后返回。class Solution { public int numSimilarGroups(String[] strs) { int n = strs.length; UnionFind uf = new UnionFind(n);原创 2021-01-31 09:35:49 · 123 阅读 · 0 评论 -
[leetCode]778. 水位上升的泳池中游泳
题目https://leetcode-cn.com/problems/swim-in-rising-water/二分查找如果在某一个时间 t0,可以从左上角到达右下角那么,当 t > t0 时仍然可以从左上角到达右下角,因此可以使用二分查找。根据提示给的范围在[0, N*N - 1]区间内猜一个数,然后进行深度优先搜索,或者广度优先搜索,搜索完毕时根据是否能到达左下角来确定如何缩小区间范围。class Solution { private int[][] dirs = ne原创 2021-01-30 15:44:05 · 102 阅读 · 0 评论 -
[leetCode]最小体力消耗路径
题目https://leetcode-cn.com/problems/path-with-minimum-effort/二分查找题目可以转化为:是否存在一条路径,该路径上的体力值不超过x,可以从左上角到达右下角假设x = x0时存在路径可以从左上角到达右下角,那么当x增大时原来的路径仍然可以使用。因此可以使用二分查找,每次估测一个x,然后进行广度或者深度优先搜索,最后根据能否到达右下角来缩小搜索范围。class Solution { private int[][] dirs =原创 2021-01-29 11:26:48 · 279 阅读 · 0 评论 -
[leetCode]1579. 保证图可完全遍历
题目https://leetcode-cn.com/problems/remove-max-number-of-edges-to-keep-graph-fully-traversable/并查集对于Alice来说当图中只有Alice的独占边和公共边时要求整个图是连通的,也就是说整个图的连通分量只有一个。同理,对于Bob来说当图中只有Bob的独占边和公共边时也要求整个图是连通的。题目要求删除最多的边,也就是要保留最少的边,可以通过给含有n个节点的无向图添加边来满足上面的要求。添加边的策略是优原创 2021-01-27 16:05:47 · 82 阅读 · 0 评论 -
[leetCode]959. 由斜杠划分区域
题目https://leetcode-cn.com/problems/regions-cut-by-slashes/并查集这题的关键点就是如何将每个方格进行划分,以及如何计算每个小方格的坐标,然后根据每个方格的类型在方格内合并,然后再方格之间合并,最后返回连通分量的个数即可class Solution { public int regionsBySlashes(String[] grid) { int N = grid.length; int size原创 2021-01-25 17:01:20 · 114 阅读 · 0 评论 -
[leetCode]1319. 连通网络的操作次数
题目https://leetcode-cn.com/problems/number-of-operations-to-make-network-connected/solution/lian-tong-wang-luo-de-cao-zuo-ci-shu-by-leetcode-s/解法连接n台电脑则至少需要n - 1条边,如果边数小于n - 1 则直接返回-1。如果m条边组成的图中恰好有一个连通分量说明n台电脑是连通的,如果有多个连通分量则说明边集中有些边是多余的,由于边集大于等于n-1,需要原创 2021-01-23 10:11:02 · 86 阅读 · 0 评论 -
[leetCode]1489. 找到最小生成树里的关键边和伪关键边
题目https://leetcode-cn.com/problems/find-critical-and-pseudo-critical-edges-in-minimum-spanning-tree/Kruscal算法先用Kruscal算法计算其中一棵最小生成树的权值v,使用并查集维护连通分量。然后遍历每一条边,去除该边重新生成最小生成树,如果最后连通分量不为1或者权值nv > v那么这条边就是关键边,然后continue。判断是否是伪关键边可以先将当前遍历的边使用并查集进行合并,然后原创 2021-01-21 10:39:56 · 240 阅读 · 0 评论 -
[leetCode]1584. 连接所有点的最小费用
题目https://leetcode-cn.com/problems/min-cost-to-connect-all-points/Kruscal算法最小生成树:图的生成树是他的一棵含有所有顶点的无环连通子图。一幅加权图的最小生成树(MST)是它的一棵权值最小的生成树。题目可以转换为求最小生成树的权值总和Kruscal算法流程:将图G={V,E}G = \{V, E\}G={V,E} 中所有的边按照从小到达排序,等长的边任意排序初始化图G′为{V,、∅}G'为 \{V, 、\v原创 2021-01-19 09:30:56 · 168 阅读 · 0 评论 -
[leetCode]721. 账户合并
题目https://leetcode-cn.com/problems/accounts-merge/并查集账户之间只要有一个邮箱相同那么就是同一个账户,也就是同属一个连通分量因此可以使用并查集。由于并查集底层使用了数组,需要知道一共有多少个不同的邮箱,因此可以使用哈希表给每个邮箱编号,并使用哈希表记录每个邮箱对应的姓名。遍历所有账户,对每个账户的邮箱进行合并就能知道合并完成后一共有几个账户。查询每个邮箱对应哪一个账户(连通分量)将其添加到该账户的列表下,然后将每个列表排序后,使用某个邮箱查询对应原创 2021-01-18 09:57:06 · 135 阅读 · 0 评论 -
[leetCode]947. 移除最多的同行或同列石头
题目https://leetcode-cn.com/problems/most-stones-removed-with-same-row-or-column/并查集移除石头的过程其实就是有个逆向深度优先搜索或者广度优先搜索的过程。石子的横坐标相等或纵坐标相等相当于在石子之间形成了边。同一个连通分量的石子一定能移除到只剩下一块,所以题目可以转化为求连通分量的个数,而题目给的输入数组是石子的坐标,因此可以考虑使用并查集。并查集中「合并」的语义是:所有横坐标为 x 的石头和所有纵坐标为 y 的石头原创 2021-01-15 10:28:24 · 145 阅读 · 0 评论 -
[leetCode]684. 冗余连接
题目https://leetcode-cn.com/problems/redundant-connection/并查集在一棵树中,边的数量比树的结点少一个。这道题中的图在树的基础上多了一条附加的边,因此边的数量也是 N。使用并查集来查找附加的边。一开始所有结点都属于各自独立的一个连通分量,遍历每一条边,如果两个结点属于不同的连通分量则将两个结点合并,合并的两个结点已经属于同一个连通分量则说明这条边是附加的。class Solution { private int[] parent;原创 2021-01-13 12:15:35 · 108 阅读 · 0 评论 -
[leetCode]1202. 交换字符串中的元素
题目https://leetcode-cn.com/problems/smallest-string-with-swaps/并查集 分析示例可以发现索引交换具有传递性,如果两个索引对出现公共索引,那么索引对中的下标可以任意交换 将可任意交换次序的部分按照字典序升序排序,得到的字符串的字典序就是最小的;问题可以转化为下标连通分量的问题。 先根据索引对集合将索引合并,这样可任意交换的索引同处一个连通分量。由于字符串每个索引位置的字符都应取该索引对应连通分量中的字典序的最小值,因原创 2021-01-11 11:06:51 · 257 阅读 · 0 评论 -
[leetCode]547. 朋友圈
题目链接:https://leetcode-cn.com/problems/friend-circles班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。示例原创 2020-11-15 16:46:16 · 134 阅读 · 0 评论 -
[leetCode]399. 除法求值
题目https://leetcode-cn.com/problems/evaluate-division/并查集class Solution { public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) { int equationsSize = equations.size(原创 2021-01-06 11:36:15 · 98 阅读 · 0 评论 -
[leetCode]990. 等式方程的可满足性
题目https://leetcode-cn.com/problems/satisfiability-of-equality-equations/并查集由题可知等式关系具有传递性,==可以看作链接两个顶点的边,如果 a==b,b==c那么a==ca==b, b == c 那么 a == ca==b,b==c那么a==c所以相等的分量同属于一个连通分量,可以使用并查集来维护这种连通分量的关系。首先遍历所有等式,将顶点合并构建并查集再遍历所有不等式,通过并查集判断两个顶点是否连通,如果连通则产生原创 2021-01-06 10:11:52 · 173 阅读 · 0 评论