200. 岛屿数量
并查集解法
class Union {
// 用一个一维数组表示联通关系。记录该数组每个节点的父节点的位置
int[] parent;
int cnt = 0;
Union(int length) {
this.parent = new int[length];
}
// 查,且路径压缩。就是查找该位置的根节点/父亲是谁
int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
// 并,合并两个节点所在的联通分量
void union(int x, int y) {
int px = find(x);
int py = find(y);
//分别查找这两个节点的根节点,然后随便选择一个作为父节点
if (px != py) {
parent[px] = py;
cnt--;
}
}
// 还差一个初始化,一般parent[i]=i。本题不是每个位置都有父节点,本题的0代表不是连通图的一部分
}
class Solution {
public int numIslands(char[][] grid) {
int m = grid.length;
int n = grid[0].length;
Union uj = new Union(m*n);
// 并查集的初始化
for (int i=0; i< m; i++) {
for (int j=0;j<n;j++) {
if (grid[i][j]=='1') {
uj.parent[i*n + j] = i*n+j;
uj.cnt = uj.cnt+1;
}
}
}
System.out.println("##### " + uj.cnt);
for (int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if (grid[i][j] == '1') {
grid[i][j] = '0';
if (i-1>=0 && grid[i-1][j]=='1') {
uj.union((i-1)*n+j, i*n+j);
}
if (i+1<m && grid[i+1][j] == '1') {
uj.union((i+1)*n+j, i*n+j);
}
if (j-1>=0 && grid[i][j-1]=='1') {
uj.union(i*n+j-1, i*n+j);
}
if (j+1<n && grid[i][j+1] == '1') {
uj.union(i*n+j+1, i*n+j);
}
}
}
}
return uj.cnt;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2021-08-09 120. 三角形最小路径和