标签:200 map int Number grid findRoot x2 Islands y2
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};
}
}
标签:200,map,int,Number,grid,findRoot,x2,Islands,y2 来源: https://blog.csdn.net/laohixdxm00/article/details/118024833
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。