- 欢迎评论讨论
1.1. 并查集应用
- 找连通分量
- kruscal最小生成树的存储结构
- 求最近公共祖先(Least Common Ancestors, LCA)
- 并查集三大部分
- 初始化
- 找根
- 合并: 其中一个根下放另一个并查集的根
- parent数组全置为-1
- parent中存储的如果是非负数: 存的是父节点的下标
- parent存的是负数: 其绝对值为该并查集的元素个数
int find(int x) {
while(parent[x]>=0) x=parent[x];
return x;
}
1.2.3. 合并
union(parent[],i,j)
parent[i]=j;
- j为i的父节点
- https://leetcode-cn.com/problems/number-of-islands/
【[一篇看懂]啥是并查集、咋写并查集(附例题)】给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。3. 答案(并查集解)
示例 1:
输入:
11110
11010
11000
00000
输出: 1
- 遍历二维网格,将竖直或水平相邻的陆地联结。最终,返回并查集数据结构中相连部分的数量。
- 更多具体思路看这里:https://leetcode-cn.com/problems/number-of-islands/solution/dao-yu-shu-liang-by-leetcode/
文章图片
class UF{
int[] parent;
int count=0;
// 连通分量数
UF(char[][] grid){
if(grid==null||grid.length==0) return;
int rowN=grid.length;
int colN=grid[0].length;
parent=new int[rowN*colN];
for(int i=0;
i!=rowN;
i++)
for(int j=0;
j!=colN;
j++)
if(grid[i][j]=='1') {
// 已经自动考虑parent是以0开始的
parent[i*colN+j]=-1;
count++;
// 连通分量初始化
}
}
int find(int x) {
while(parent[x]>=0) x=parent[x];
return x;
}
void union(int x,int y) {
int rootx=find(x);
int rooty=find(y);
if(rootx==rooty) return;
parent[rootx]=rooty;
parent[rooty]--;
count--;
// 合并一次连通分量少一个
}
}
3.2. 答案
class Solution {
public int numIslands(char[][] grid) {
if(grid==null||grid.length==0) return 0;
int rowN=grid.length,colN=grid[0].length;
UF uf = new UF(grid);
for(int i=0;
i!=rowN;
i++)
for(int j=0;
j!=colN;
j++)
if(grid[i][j]=='1') {
grid[i][j]='0';
if(i+1
3.3. 测试
public static void main(String[] args) {
char[][] grid= {{'1','1','1','1','0'},{'1','1','0','1','0'},
{'1','1','0','0','0'},{'0','0','0','0','0'}};
int test=1;
Solution s = new Solution();
int out = s.numIslands(grid);
if(out==test)
System.out.println("ok");
else
System.out.println("fail:"+out);
}
}
4. 参考link
- https://www.cnblogs.com/cyjb/p/UnionFindSets.html
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)