「这是我参与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代表陆地的面积,0代表水的面积,而且你可以认为四周都是被水包围,我们就可以遍历当前网格的一个二维数组 - 如果遍历到为
1的元素,我们就可以记录当前存在的岛屿数量为1,然后还需要递归当前岛屿周围(垂直和水平方向)是否是陆地,如果是陆地的话,我们需要把原本标志为1的值改为0,因为这里都属于一块岛屿,并且我们已经记录了当前岛屿的数量,直到递归到周围都不是‘1’状态的值了,我们再遍历二维数组 - 如果再次找到状态
‘1’的值,我们就要重复步骤2,直到遍历完整个二维数组为止 - 最后返回保存岛屿数量的变量即可
代码实现
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; // 返回岛屿的数量
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;