[路飞][LeetCode]200_岛屿数量

116 阅读1分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

给你一个由 '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

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

解题思路

  • 我们遍历输入的岛屿矩阵拿到每行的岛屿数组
  • 于此同时,我们对每行的岛屿数组也进行遍历
  • 如果岛屿数组中存在岛屿,我们将其进行递归处理并将岛屿数量+1
  • 既然用到了递归,我们就要设定好递归结束条件if(i<0||i>=g.length||j<0||j>=g[i].length||g[i][j]==0) {return}
  • 这里我们来解释一下:当下标超出对应的界限或者递归到水('0')时结束递归
  • 将递归到的这一项标记为水('0')
  • 然后依次将当前项的上下左右四个方向的项进行处理
  • 最后返回统计结果count

解题代码

var numIslands = function(grid) {
    let count = 0
    const handle = (g,i,j)=>{
        if(i<0||i>=g.length||j<0||j>=g[i].length||g[i][j]==0) {return}
        g[i][j]=0
        handle(g,i-1,j)
        handle(g,i+1,j)
        handle(g,i,j-1)
        handle(g,i,j+1)
    }
    for(let i =0;i<grid.length;i++){
        for(let j=0;j<grid[i].length;j++){
            if(grid[i][j]==1){
                count++
                handle(grid,i,j)
            }
        }
    }
    return count
};

如有任何问题或建议,欢迎评论区留言讨论!