class Solution {
public int numIslands(char[][] grid) {
int rows = grid.length;
int cols = grid[0].length;
UnionFind unionFind = new UnionFind(0, new int[rows * cols]);
for (int i = 0; i < rows; i ++) {
for (int j = 0; j < cols; j ++) {
if (grid[i][j] == '1') {
unionFind.count ++;
unionFind.parent[i * cols + j] = i * cols + j;
}
}
}
for (int i = 0; i < rows; i ++) {
for (int j = 0; j < cols; j ++) {
if (grid[i][j] == '1') {
grid[i][j] = '0';
if (i - 1 >= 0 && grid[i - 1][j] == '1') {
unionFind.union(i * cols + j, (i - 1) * cols + j);
}
if (i + 1< rows && grid[i + 1][j] == '1') {
unionFind.union(i * cols + j, (i + 1) * cols + j);
}
if (j - 1 >= 0 && grid[i][j - 1] == '1') {
unionFind.union(i * cols + j, i * cols + j - 1);
}
if (j + 1 < cols && grid[i][j + 1] == '1') {
unionFind.union(i * cols + j, i * cols + j + 1);
}
}
}
}
return unionFind.count;
}
}
class UnionFind {
public int count;
public int[] parent;
public UnionFind(int count, int[] parent) {
this.count = count;
this.parent = parent;
}
public int find(int[] parent, int index) {
if (parent[index] == index) {
return index;
}
return find(parent, parent[index]);
}
public void union(int first, int second) {
int firstRoot = find(parent, first);
int secondRoot = find(parent, second);
if (firstRoot != secondRoot) {
count--;
parent[firstRoot] = secondRoot;
}
}
}
并查集模板
最新推荐文章于 2025-12-19 16:34:09 发布
2677

被折叠的 条评论
为什么被折叠?



