「这是我参与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.lengthn == grid[i].length1 <= m, n <= 300grid[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
};
如有任何问题或建议,欢迎评论区留言讨论!