岛屿数量
题目描述
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
示例
代码
import java.util.*;
public class Solution {
/**
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
static class UnionFind{
int count;
int[] p;
public UnionFind(char[][] grid){
int row = grid.length;
int col = grid[0].length;
this.p = new int[row*col];
//标记所有‘1’的位置
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++){
if(grid[i][j]=='1'){
int index = i*col + j;
p[index] = index;
count++;
}
}
}
//合并集
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++){
if(grid[i][j]=='1'){
if(i > 0 && grid[i-1][j]=='1')
union(i * col + j, (i - 1) * col + j);
if (j > 0 && grid[i][j - 1] == '1')
union(i * col + j, i * col + j - 1);
}
}
}
}
public void union(int cur, int pre){
//更正节点在p中的位置
cur = find(cur);
pre = find(pre);
if(cur != pre){
p[cur] = p[pre];
count--;
}
}
//主要应对[1 1] [1 1]的情况
public int find(int i){
while(p[i]!=i) i=p[i];
return i;
}
}
public int solve (char[][] grid) {
UnionFind uf = new UnionFind(grid);
return uf.count;
}
}