[路飞]_js算法:leetcode 200-岛屿数量

192 阅读1分钟

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;
  }
}