[路飞]_200. 岛屿数量

126 阅读2分钟

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

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
「提示:」
1. m == grid.length
1. n == grid[i].length
1. 1 <= m, n <= 300
1. grid[i][j] 的值为 '0''1'

解题思路

  1. 由题目我们可以得知,1 代表陆地的面积,0 代表水的面积,而且你可以认为四周都是被水包围,我们就可以遍历当前网格的一个二维数组
  2. 如果遍历到为1的元素,我们就可以记录当前存在的岛屿数量为1,然后还需要递归当前岛屿周围(垂直和水平方向)是否是陆地,如果是陆地的话,我们需要把原本标志为1的值改为0,因为这里都属于一块岛屿,并且我们已经记录了当前岛屿的数量,直到递归到周围都不是‘1’状态的值了,我们再遍历二维数组
  3. 如果再次找到状态‘1’的值,我们就要重复 步骤2 ,直到遍历完整个二维数组为止
  4. 最后返回保存岛屿数量的变量即可

代码实现

var numIslands = function(grid) {
    let x = grid[0].length, y = grid.length;
    let res = 0;
    for (let i=0; i<y; i++) { // 遍历二维网状数组
        for (let j=0; j<x; j++) {
            if (grid[i][j] === '1') { // 如果有值为'1'的,就说明一定是一块岛屿
                res++; // 岛屿数量 + 1
                handle(i,j); // 查看岛屿周围是否有陆地
            }
        }
    }
    function handle(i,j) {
        if (i<0 || i>=y || j<0 || j>=x || grid[i][j] === '0') return; // 岛屿周围没有陆地,本次递归结束
        grid[i][j] = '0'; // 如果有陆地把‘1’改为‘0’
      	// 递归四周
        handle(i+1, j);
        handle(i-1, j);
        handle(i, j+1);
        handle(i, j-1);
    }
    return res; // 返回岛屿的数量
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;