并查集-上
使用场景
- 一开始每个元素都拥有自己的集合,在自己的集合里只有这个元素自己
- int find(i):查找i所在集合的代表元素,代表元素来代表i所在的集合,查找过程中进行扁平化
- boolean isSameSet(a, b):判断a和b在不在一个集合里,即判断a和b的代表是否是同一个
- void union(a, b):a所在集合所有元素 与 b所在集合所有元素 合并成一个集合,可能进行小挂大
- 各种操作单次调用的均摊时间复杂度为O(1)
题目1
题目链接:并查集的实现牛客题霸牛客网
代码
1 | package com.study.class56; |
题目2
题目链接:P3367 【模板】并查集 - 洛谷
- 用递归实现路径压缩,省略小挂大
代码
1 | package com.study.class56; |
题目3
题目链接:765. 情侣牵手
解题思路
-
**初始化并查集,共 **
n = row.length / 2个情侣组; -
遍历每个座位
- 计算两人所属的情侣组:
a = row[i] / 2,b = row[i+1] / 2 - **在并查集中合并 **
a和b
- 计算两人所属的情侣组:
-
设最终连通分量数量为 ,一个分组中有n队情侣,交换次数为
n-11
sets
,则答案为:
ans=n−sets
代码
1 | class Solution { |
题目4
解题思路
- 初始化并查集:每个字符串自成一组(共
n组)。 - **枚举所有字符串对 **
(i, j)- 若在一个集合,跳过;
- **否则逐位比较 **
strs[i]和strs[j],统计不同位置数diff; - **若 **
diff == 0或diff == 2(完全相同或相似),执行union(i, j)。
- 返回最终的组数
sets。
代码
1 | class Solution { |
题目5
题目链接:200. 岛屿数量
解题思路
- **将每个 **
'1'视为一个独立节点。 - 遍历网格,若当前格子是
'1',则检查其左邻居和上邻居是否也是'1'。- 每一个节点都会遍历其左边和右边,不会遗漏
- 如果是,则将当前格子与邻居****合并到同一集合。
- 最终剩余的集合数即为岛屿数量。
代码
1 | class Solution { |
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自Heaven
