https://leetcode-cn.com/problems/number-of-islands/
[bug]
class Solution {
char[][] grid;
int w, h;
int[][] dirs = {{-1,0}, {1,0}, {0,-1}, {0,1}};
Map<Integer, Integer> map = new HashMap<>();
public int numIslands(char[][] grid) {
this.grid = grid;
int w = grid[0].length;
int h = grid.length;
unionFind();
Set<Integer> rep = new HashSet<>();
for(int y=0;y<h;y++){
for(int x=0;x<w;x++){
if(grid[y][x]==1){
int[] root = findRoot(y, x);
rep.add(toNum(root[0], root[1]));
}
}
}
return rep.size();
}
void unionFind(){
for(int y=0;y<h;y++){
for(int x=0;x<w;x++){
if(grid[y][x]==0){
continue;
}
map.put(y*w+x, y*w+x);
for(int[] dir:dirs){
int y2 = y + dir[0];
int x2 = x + dir[1];
if(grid[y2][x2]==0){
continue;
}
int[] root1 = findRoot(y, x);
int[] root2 = findRoot(y2, x2);
int rep1 = toNum(root2[0], root2[1]);
int rep2 = toNum(root1[0], root1[1]);
if(rep1==rep2){
continue;
}
map.put(rep2, rep1);
}
}
}
}
int toNum(int y, int x){
return y*w+x;
}
int[] findRoot(int y, int x){
int k = y*w + x;
while(map.get(k)!=k){
int v = map.get(k);
k = v;
}
int y2 = k/w;
int x2 = k%w;
return new int[]{y, x};
}
}