leetcode 200. 岛屿数量
问题描述: 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入: grid = [
["1","1","1","1","0"],
["1","1","0","1","0"],
["1","1","0","0","0"],
["0","0","0","0","0"]
]
输出: 1
示例 2:
输入: grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
输出: 3
思路: 并查集
/**
* @param {character[][]} grid
* @return {number}
*/
var numIslands = function(grid) {
let len=grid[0].length;
let union=new unionSize(grid.length*len);
function findIndex(x,y){
return x*len+y
}
for(let i=0;i<grid.length; i++){
for(let j=0;j<len;j++){
if(grid[i][j]=='0')continue;
if(i>0&&grid[i-1][j]=='1'){
union.merge(findIndex(i,j),findIndex(i-1,j))
}
if(j>0&&grid[i][j-1]=='1'){
union.merge(findIndex(i,j),findIndex(i,j-1))
}
}
}
let res=0;
for(let i=0;i<grid.length;i++){
for(let j=0;j<len;j++){
if(grid[i][j]=='1'&&findIndex(i,j)==union.find(findIndex(i,j)))res++
}
}
return res
};
class unionSize{
constructor(n){
this.node=new Array(n).fill(0).map((item,index)=>index);
}
find(x){
return this.node[x]=(x==this.node[x]?x:this.find(this.node[x]))
}
merge(x,y){
let fa=this.find(x),fb=this.find(y);
this.node[fa]=fb;
}
}