「LeetCode」200-岛屿数量

133 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

二、思路分析:

这道题是面试经常考到的岛屿类题目,而一般的岛屿题目总是会涉及BFS,DFS等经典算法,本文的岛屿题目是最经典的数岛屿数量题目,首先我们就需要想到利用dfs去进行求解。

那么针对这道题目我们需要怎么进行求解呢?我们怎么标记岛屿的数量呢?针对这些问题我们需要想到:首先我们如果遍历的时候遇到了值为'1'的岛屿,那么我们将结果加1,然后利用DFS将这个岛屿周围全部淹没,即将周围的全部置为'0',同时我们也将刚遍历的岛屿的周围再次利用DFS将四周同样变成海洋,这样我们就通过遍历能够统计出岛屿的数量了。基本思路如下图所示:

image.png

三、代码:

/**
 * @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能够高效的解决这类问题,所以我们需要直到,每个题目都有固定的思路和框架,就在于自己是否能够掌握。