并查集(Union find):
- 在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。
我个人理解的人话就是:
将相关的元素并到一个集合里,在这个过程中要先查这些元素是不是已经在集合中
并查集分为三个部分
- 把每个点所在集合初始化为其自身。通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。
- 查找元素所在的集合,即根节点。
- 将两个元素所在的集合合并为一个集合。通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。
值得注意的一点是,这里的根节点和普通意义上的根节点不同:一个元素的根节点可能是他自身。
比如一个集合(1,2,3,4),这个集合的根节点可能是集合中的任意一个数字,假设我们取1,那么1的根节点就是它自身。
并查集是一个比较套路化的算法,实际应用过程中只需要根据题目稍作修改。
第一道题是一道写过的题,之前用DFS写的,限制尝试用并查集。
200 岛屿数量
思路很简单:
- 遍历矩阵
- 如果一个元素等于1,那么就检查他周围的元素(上下左右)
- 如果周围的元素中某个值为1,那么就将这两个元素做并集
- 统计集合的个数
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
# 获取行列数目
row, col = len(grid), len(grid[0])
# 初始化root
root =[i for i in range(row*col)]
# 这里采用一个思路解决计数问题:
# 每发现一个1,则count+=1,每合并一个1,则count-=1
# 这样一个集合合并后,count相当于只加了1,记录了根节点的数量
# 那么最后count的数量,就是岛屿的数量
count =