leetcode 200. 岛屿数量

110 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

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

思路分析: 这是一道经典的岛屿问题,一般来说可以通过深度优先的遍历方式和广度优先的遍历方式来解决,这道题也不例外。

在一般的二叉树中我们使用深度优先时只需要判断左右两个子节点,而在岛屿问题中,我们可能就需要判断更多,因为它有四个方向,所以我们四个方向都需要判断

        if(grid[x][y-1]==="1")deep(x,y-1)
        if(grid[x][y+1]==="1")deep(x,y+1)
        if(grid[x+1]&&grid[x+1][y]==="1")deep(x+1,y)
        if(grid[x-1]&&grid[x-1][y]==="1")deep(x-1,y)

我们在判断四个方向时,还会有个问题,那就是我们可能会出现判断完一个元素后又回到了上个元素进行判断,这样陷入了无限循环,这个问题也很好解决,之前在处理递归时,我们会使用备忘录来记录已处理的元素,而在这个地方,我们可以把已经处理过的元素直接置为0,这样后续碰到它就会直接跳过

let deep = (x,y)=>{
        grid[x][y] = "0"
        if(grid[x][y-1]==="1")deep(x,y-1)
        if(grid[x][y+1]==="1")deep(x,y+1)
        if(grid[x+1]&&grid[x+1][y]==="1")deep(x+1,y)
        if(grid[x-1]&&grid[x-1][y]==="1")deep(x-1,y)
    }   

这样,我们就处理完了当遇到一个岛屿时,对它衍生部分的处理。

整体代码:

var numIslands = function(grid) {
    let count = 0
    let deep = (x,y)=>{
        grid[x][y] = "0"
        if(grid[x][y-1]==="1")deep(x,y-1)
        if(grid[x][y+1]==="1")deep(x,y+1)
        if(grid[x+1]&&grid[x+1][y]==="1")deep(x+1,y)
        if(grid[x-1]&&grid[x-1][y]==="1")deep(x-1,y)
    }   
    for(let i = 0; i<grid.length;i++){
        for(let y = 0; y<grid[i].length;y++){
            if(grid[i][y]==="1"){
                deep(i,y)
                count++
            }
        }
    }
    return count
};