并查集Union Find
文章平均质量分 80
CP Coding
这个作者很懒,什么都没留下…
展开
-
LeetCode 947. Most Stones Removed with Same Row or Column - 彻底掌握并查集(Union Find)系列题20
题目要我们尽可能多地从一个二维矩阵里移除石头,给的移除条件是,如果一颗石头所在的行或者列上有其他石头那么这颗石头就可以被移除。因此如果我们把具有相同行坐标或者相同列坐标的石头合并成一个集合,那么这个集合里石头就可以一颗一颗地被移除直到只剩下最后一颗。也就说最后每个集合都只剩下一颗石头,因此石头总数减去集合个数就是最多可移除的石头数。很显然这种问题用并查集UnionFind解答再适合不过。原创 2021-12-05 03:07:03 · 210 阅读 · 0 评论 -
LeetCode 785. Is Graph Bipartite? - 彻底掌握并查集(Union Find)系列题19
题目问是否可以把一个图里的所有顶点分成两个集合使得图里的每条边的两个顶点必须分布在两个集合而不能有一条边的两个顶点出现在同一个集合里。也就是说如果一个顶点属于集合A,那么它的所有邻居就必须属于集合B。这就给我们提供了合并条件,用并查集Union Find对每个顶点的所有邻居进行合并。在合并一个顶点的每个邻居时需要判断顶点与邻居是否已经同属一个集合了,如果是表示出现冲突以致无法把图分成两个集合。原创 2021-12-05 00:14:20 · 660 阅读 · 0 评论 -
LeetCode 399. Evaluate Division - 彻底掌握并查集(Union Find)系列题18
这道题在并查集Union Find系列里算是比较难的一道题。因为不仅要把有关系的变量合并到一个集合里,还得知道各个变量之间的比例关系。刷完这题,基本上可以彻底掌握并查集Union Find了。我们知道在并查集数据结构里的每个集合都有一个根节点,如果我们存下了每个节点跟根节点的比例关系,那就可以算出集合里的任意两个点相除的值。原创 2021-12-04 11:29:46 · 211 阅读 · 0 评论 -
LeetCode 261. Graph Valid Tree - 彻底掌握并查集(Union Find)系列题17
这题跟LeetCode 684. Redundant Connection几乎一样,同一类题刷来刷去解法都大同小异。题目问一个无向图是否是一棵有效树,只要知道形成有效树的条件,这道题就变得很容易了。原创 2021-12-03 06:29:20 · 604 阅读 · 0 评论 -
LeetCode 323. Number of Connected Components in an Undirected Graph - 彻底掌握并查集(Union Find)系列题16
一道用于并查集Union Find的入门上手题,解法跟Leetcode200. Number of Islands几乎一模一样,套用Union Find模板几乎不要改动。对每条边的两个顶点进行合并,最后集合个数就是答案。原创 2021-12-03 05:59:04 · 237 阅读 · 0 评论 -
LeetCode 685. Redundant Connection II - 彻底掌握并查集(Union Find)系列题15
这题是上一题LeetCode 684. Redundant Connection的拓展,无向图变成了有向图,难度瞬间提高。好在题目的条件是只增加一条边使得原本的图不能形成一棵树。题目中说一个有向图要是一棵树那必须是满足以下条件:只有一个根节点(无父节点),其余节点有且只有一个直系父节点,图中不能存在环。增加一条边破坏一棵树有三种可能:形成了一个环;使得一个节点有2个直系父节点(即有2条指向该节点的边);即形成一个环又使得一个节点有2个父节点原创 2021-12-03 03:36:27 · 281 阅读 · 0 评论 -
LeetCode 684. Redundant Connection - 彻底掌握并查集(Union Find)系列题14
题目出现关键字 connection, 首先想到并查集(Union Find)。关于图Graph的顶点vertices间的连通关系的问题也是经常可以用并查集(Union Find)解决的一类问题。这题对一张图Graph是否是一棵树Tree做了定义:各顶点是连通的但不能形成一个环,即图中不能出现两个顶点既可以间接连通又有一条边直接连通。这就变成了典型的并查集问题了,对每条边的两个顶点进行合并,当在合并一条边的两个顶点时发现它们已经在同一集合里,那么这条就是多余的可以被移除。原创 2021-12-02 06:14:25 · 360 阅读 · 0 评论 -
LeetCode 130. Surrounded Regions - 彻底掌握并查集(Union Find)系列题13
跟求封闭岛屿题Leetcode1254. Number of Closed Islands基本上一样。先用并查集(Union Find)合并所有相连的‘O’的集合,同时标注‘O’集合是否为封闭的。最后遍历一遍矩阵把属于封闭集合的‘O’改成‘X’。具体分析可以参考Leetcode1254. Number of Closed Islands原创 2021-12-02 02:53:10 · 295 阅读 · 0 评论 -
Leetcode 1319. Number of Operations to Make Network Connected - 彻底掌握并查集(Union Find)系列题12
题目又多处出现关键词connected,可以确定是连通性问题,马上想到并查集(Union Find)。这道题的问法跟之前的并查集题稍有不同,但是万变不离其宗,仍然可以套用并查集(Union Find)模板。原创 2021-12-01 16:57:45 · 329 阅读 · 0 评论 -
Leetcode 1020. Number of Enclaves - 彻底掌握并查集(Union Find)系列题11
读完题目感觉似曾相识,没错这道题跟Leetcode1254. Number of Closed Islands高度相似。唯一一点区别是,一道题是求封闭岛屿的总个数,另一道是求所有封闭岛屿包含的陆地总个数。解题思路和代码几乎可以完全照搬Leetcode1254. Number of Closed Islands原创 2021-12-01 07:48:24 · 227 阅读 · 0 评论 -
LeetCode 547. Number of Provinces - 彻底掌握并查集(Union Find)系列题10
题目中多次出现关键字connected,并且要求省份的个数(即集合个数),是一道典型的关于连通性合并的问题,毫无疑问可以用并查集(Union Find)来解答。代码与求岛屿个数Leetcode200. Number of Islands大同小异,只是合并的条件略有不同,直接套用Union Find代码模板稍加修改即可。一道难度为Medium的题瞬间变成easy。原创 2021-12-01 07:02:40 · 289 阅读 · 0 评论 -
LeetCode1905. Count Sub Islands - 彻底掌握并查集(Union Find)系列题9
瞅一眼标题就知道可以用并查集(Union Find)来解答。扫一眼题目感觉这道题挺复杂,输入有两个矩阵,要判断第二个矩阵的岛屿是否是第一个矩阵的岛屿的子岛屿。感觉需要对两个矩阵做岛屿合并然后再进行比较。其实再细读一遍题目就会发现并没有那么复杂。原创 2021-12-01 04:40:06 · 267 阅读 · 0 评论 -
LeetCode711. Number of Distinct Islands II - - 彻底掌握并查集(Union Find)系列题8
这道题是LeetCode694. Number of Distinct Islands的延伸。对于求岛屿个数已经没有任何难度了,直接套用并查集(Union Find)模板即可。题目被标为hard是因为题目对相同岛屿的定义使得判断两个岛屿是否相同的难度加大,原创 2021-11-30 06:01:53 · 260 阅读 · 0 评论 -
LeetCode694. Number of Distinct Islands - 彻底掌握并查集(Union Find)系列题7
这道题还是Leetcode200. Number of Islands的拓展,求岛屿个数的方法一模一样,代码几乎可以重复使用。这道题的难点是,算完岛屿个数后要把形状相同的岛屿剔除,剩下的不同形状的岛屿个数。原创 2021-11-29 21:56:00 · 303 阅读 · 0 评论 -
Leetcode1254. Number of Closed Islands - 彻底掌握并查集(Union Find)系列题6
看标题就知道可以用并查集(Union Find)来解答。这又是一道Leetcode200. Number of Islands的改进题,因此只要对Leetcode200. Number of Islands的代码略加改动即可。这道题是要求封闭岛屿的数量,Leetcode200. Number of Islands用并查集方法算出了岛屿的总个数,因此如果我们知道哪些岛屿是封闭的哪些是不封闭的,也就得到了答案。原创 2021-11-29 00:17:52 · 223 阅读 · 0 评论 -
LeetCode305. Number of Islands II - 彻底掌握并查集(Union Find)系列题5
这道题是Leetcode200. Number of Islands的改进版,很显然可以用并查集(Union Find)来解答。唯一不同的就是陆地是随着positions数组动态增加的,每增加一块陆地就要统计当前岛屿的个数。由于我们再Union Find数据结构里维护了一个岛屿计数的变量,因此每增加一块新陆地,进行更新合并之后,我们就可以立刻得到岛屿的个数。原创 2021-11-27 12:16:39 · 318 阅读 · 0 评论 -
Leetcode827. Making A Large Island - 彻底掌握并查集(Union Find)系列题4
又是一道岛屿题,虽然这道题难度级别为hard,但是如果已经掌握了并查集(Union Find), 而且会用Union Find解答Leetcode200. Number of Islands和Leetcode695. Max Area of Island,就会发现这道题就不再是hard,其实跟前面两道题类似,同样可以用并查集(Union Find)来解答。原创 2021-11-27 06:11:31 · 287 阅读 · 0 评论 -
Leetcode695. Max Area of Island - 彻底掌握并查集(Union Find)系列题3
这道题跟Leetcode200. Number of Islands几乎一模一样,唯一不同是那到题是求岛屿的个数,而这道题是求最大岛屿的大小。因此,毫无疑问可以用并查集(Union Find)来求解,只要对Leetcode200. Number of Islands做个小改动即可,即把UnionFind类中的维护集合个数的变量换成最大集合的大小。原创 2021-11-27 02:11:04 · 287 阅读 · 0 评论 -
Leetcode128. Longest Consecutive Sequence - 彻底掌握并查集(Union Find)系列题2
这道题有很多解法,比如通过排序或者使用Hashmap。但是通过分析题目就会发现这题还可以使用并查集(Union Find)来解答。我们知道并查集(Union Find)是解决连通性问题和处理集合的合并与查找问题。题目要求是从一个未排序的数组中查找一个最长的连续数的序列,其实就是合并连续的数,然后查找最长连续数序列,刚好满足并查集特性。原创 2021-11-26 23:23:39 · 198 阅读 · 0 评论 -
Leetcode200. Number of Islands - 彻底掌握并查集(Union Find)系列题1
这道的常规解法是用深度优先搜索(DFS)或宽度优先搜索(BFS)来解决。其实这道题还可以用并查集(Union Find)算法来解决。我们知道并查集(Union Find)是用来解决连通问题,即处理集合的查找合并问题。而这道题里的岛的概念就是把连通的陆地合并成一个岛,相当于是矩阵里所有相连的‘1’合并成一个集合,最后集合个数就是所要求的岛的个数。原创 2021-11-25 12:03:14 · 796 阅读 · 0 评论