力扣-200.岛屿数量(js)

LeetCode第200题岛屿数量(js实现思想参考up JS老毕)

    • 题目
    • 解题思想
    • 代码

题目

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:
[
[‘1’,‘1’,‘1’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘0’,‘0’]
]
输出: 1
示例 2:

输入:
[
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘1’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘1’,‘1’]
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思想

1.先了解一下深度优先搜索(dfs)和广度优先搜索(bfs)的基本思想。
深度优先:
深度优先遍历图的方法是,从图中某顶点v出发:
(1)访问顶点v;
(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;
(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。
广度优先:
是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
2.在这道题中,我们考虑使用深度优先搜索。
3.如图:力扣-200.岛屿数量(js)_第1张图片
①:grid[0][0]为1,1代表陆地,那么我们就遍历grid[0][0]的上下左右。由于上和左没有,我们就探寻grid[0][1]和grid[1][0],由于采用的深度优先,我们先遍历grid[1][0],判断是否为1,是1,则继续遍历grid[2][0],由于grid[3][0]不为1,我们接下来遍历grid[2][1],循环往复,一般遇到非0的,我们就开始回溯,去遍历上一个周围其他未遍历的。
②: 我们每遍历过一个为1的,就将其置为0,并且,如果我们遍历的这个位置的周围通过遍历都是字符0 的话,那么我们的岛屿数量count就加一。
③: 一直遍历,直至整个grid遍历完为止。

代码

// atom-one-night
var numIslands = function(grid) {
     
    let count = 0;

    for(let row=0;row<grid.length;row++){
     
      for(let col=0;col<grid[0].length;col++){
     
        if(grid[row][col] === "1"){
     
          count++;
          dfs(row, col);
        }
      }
    }

    function dfs(row, col){
     
      if(row<0 || row>=grid.length || col<0 || col>=grid[0].length || grid[row][col] === "0"){
     
        return;
      }

        grid[row][col] = "0";
        dfs(row-1, col);
        dfs(row+1, col);
        dfs(row, col-1);
        dfs(row, col+1);  
    }

    return count;
  }

你可能感兴趣的:(算法,dfs,leetcode)