给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
用并查集来统计
class Solution {
public:
int fa[100000];
int sets;
int find(int x) {
if(fa[x] != x) {
fa[x] = find(fa[x]);
}
return fa[x];
}
void merge(int x,int y) {
int fx = find(x),fy = find(y);
if(fx != fy) {
fa[fx] = fy;
sets--;
}
}
int numIslands(vector<vector<char>>& grid) {
int n = grid.size();
int m = grid[0].size();
sets = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(grid[i][j] == '1') {
fa[i*m + j] = i*m + j;
sets++;
}
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(grid[i][j] == '1') {
if(j - 1 >= 0 && grid[i][j-1] == '1') {
merge(i*m+j,i*m+j-1);
}
if(i - 1 >= 0 && grid[i-1][j] == '1') {
merge(i*m+j,(i-1)*m+j);
}
}
}
}
return sets;
}
};