并查集相关的问题
解决一般的连通性问题,我们都可以用并查集来解决。
https://leetcode-cn.com/problems/friend-circles/
547、朋友圈问题
该问题是一个典型的可以用并查集解决的问题,我们只用将该二维数组中值为1的两个点连接起来就可以.
1 | class Solution { |
可以看到,我们只是简单的将并查集
这种数据结构写出来,就可以轻松的解决这个问题。 如果追求性能,我们可以基于rank优化一下,这样在连接时更快. 在之前关于介绍并查集的时候有讲到过.
- 上述是一个标准的模版过程,我们只要记住这个模版即可.
https://leetcode-cn.com/problems/number-of-islands/
200、岛屿问题
- 说实话,看到这题的第一反应应该是类似于DFS,BFS
- 但是这里我们也可以采取并查集的思想来做,并且非常简单
1 | class Solution { |
可以看到,只要运用了并查集,这种题目将会变得非常简单,首先将大致的题意写出来,然后将并查集写出来就可以AC.
值得一提的是,本题需要向四个方向搜索,这里运用到了坐标转换,将二维转换为一维来考虑.
https://leetcode-cn.com/problems/surrounded-regions/
130、被围绕的区域
先说DFS做法,该题比较重要的一点就是边界上的字母不会变化,如果我们用DFS来做的话,我们可以首先在边界搜索,然后将搜索到的O变成一个奇怪的字母,最后恢复的时候,将这个奇怪的字母转化为O即可,其余的全部变成X.
注意这个顺序,我们应该先将所有的O变成X.如果顺序颠倒,最后得到的结果应该全部是X
接下来讲一下关于并查集的做法,这里有一个比较有趣的想法就是我们设置一个虚拟节点,就像在做关于链表的问题时,我们总是会设置一个虚拟头节点.这里大致的思路就是,我们在边界搜索O,然后将其与虚拟节点相连,最后我们只需要查看虚拟节点是谁,并且将其恢复即可
1 | class Solution { |