class Solution {
int[] p;
int res;
int find(int x){
if(p[x] == x){
return x;
}
return find(p[x]);
}
void union(int x, int y){
if(find(x) == find(y)){
return;
}
p[find(y)] = p[find(x)];
res--;
}
public int numIslands(char[][] grid) {
int nr = grid.length;
int nc = grid[0].length;
p = new int[nr * nc];
for(int i = 0; i < nr;i++){
for(int j = 0; j < nc;j++){
int idx = nc * i + j;
p[idx] = idx;
if(grid[i][j] == '1'){
res++;
}
}
}
for(int i = 0; i < nr;i++){
for(int j = 0; j < nc;j++){
int idx = nc * i + j;
if(grid[i][j] == '1'){
if((i + 1) < nr && grid[i + 1][j] == '1'){
union(idx,(i + 1) * nc + j);
}
if((j + 1) < nc && grid[i][j + 1] == '1'){
union(idx,i * nc + j + 1);
}
}
}
}
return res;
}
}