200. 岛屿数量

并查集解法

Copy
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; } }
posted @   wsshub  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2021-08-09 120. 三角形最小路径和
点击右上角即可分享
微信分享提示