一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
一.题目:
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
提示:
m == grid.lengthn == grid[i].length1 <= m, n <= 300grid[i][j]的值为'0'或'1'
二、思路分析:
这道题是面试经常考到的岛屿类题目,而一般的岛屿题目总是会涉及BFS,DFS等经典算法,本文的岛屿题目是最经典的数岛屿数量题目,首先我们就需要想到利用dfs去进行求解。
那么针对这道题目我们需要怎么进行求解呢?我们怎么标记岛屿的数量呢?针对这些问题我们需要想到:首先我们如果遍历的时候遇到了值为'1'的岛屿,那么我们将结果加1,然后利用DFS将这个岛屿周围全部淹没,即将周围的全部置为'0',同时我们也将刚遍历的岛屿的周围再次利用DFS将四周同样变成海洋,这样我们就通过遍历能够统计出岛屿的数量了。基本思路如下图所示:
三、代码:
/**
* @param {character[][]} grid
* @return {number}
*/
var numIslands = function(grid) {
//难点在于如何标记岛屿
//利用dfs将我们目前遍历的岛屿周围全部淹没,即将其标记为0
let m = grid.length,n = grid[0].length
const dfs = function(grid,i,j){
//边界条件
if(i<0 || j<0 || i>=m || j>=n) return
if(grid[i][j] == '0') return
// 将其变为海水
grid[i][j] = '0'
dfs(grid,i-1,j)
dfs(grid,i+1,j)
dfs(grid,i,j-1)
dfs(grid,i,j+1)
}
let res = 0
for(let i = 0 ; i < m ; i++){
for(let j = 0 ; j < n ; j++){
if(grid[i][j] == '1'){
res++
dfs(grid,i,j)
}
}
}
return res
};
四、总结:
岛屿问题贴别经典,利用DFS能够高效的解决这类问题,所以我们需要直到,每个题目都有固定的思路和框架,就在于自己是否能够掌握。