题解 | #岛屿数量#

岛屿数量

https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e

深度优先搜索(DFS)

  • 深度优先搜索一般用于或者的遍历,其他有分支的(如二维矩阵)也适用。
  • 它的原理是从初始点开始,一直沿着同一个分支遍历,直到该分支结束,然后回溯到上一级继续沿着一个分支走到底,如此往复,直到所有的节点都有被访问到。

如何不重复统计岛屿?

为了不重复统计岛屿,可以在遇到1时把相邻的上下左右4个方向都置为0,这个过程是深度优先搜索的,即如果相邻的上下左右四个方向的内容是1,则将其置为0的过程中继续对这个位置的相邻上下左右四个方向的内容置为0

  • 终止条件: 进入某个元素修改其值为0后,遍历四个方向发现周围都没有1,那就不用继续递归,返回即可,或者递归到矩阵边界也同样可以结束。
  • 返回值: 每一级的子问题就是把修改后的矩阵返回,因为其是函数引用,也不用管。
  • 本级任务: 对于每一级任务就是将该位置的元素置为0,然后查询与之相邻的四个方向,看看能不能进入子问题。

参考

https://blog.nowcoder.net/n/f6365fcd7f89430fa6eda6f7ce525dea?f=comment

/*
 * @Author: LibraStalker **********
 * @Date: 2023-04-20 11:41:32
 * @FilePath: BM57-岛屿数量.js
 * @Description: 
 */
/**
 * 判断岛屿数量
 * @param grid string字符串型二维数组 
 * @return int整型
 */
function solve( grid ) {
    let n = grid.length;
    if (n === 0) return 0;
    let m = grid[0].length;

    let count = 0;
    for (let i = 0; i < n; ++i) {
        for (let j = 0; j < m; ++j) {
            if (grid[i][j] === "1") {
                count += 1;
                dfs(grid, i, j);
            }
        }
    }

    return count;
    // write code here
    function dfs(grid, i, j) {
        const n = grid.length;
        const m = grid[0].length;

        grid[i][j] = 0;  // 遇到1则将相邻的1全部变成0,这样就不会重复统计岛屿了

        if (i-1 >= 0 && grid[i-1][j] === "1") {  // 上面的1
            dfs(grid, i-1, j);
        }
        if (i+1 < n && grid[i+1][j] === "1") {  // 下面的1
            dfs(grid, i+1, j);
        }
        if (j-1 >= 0 && grid[i][j-1] === "1") {  // 左面的1
            dfs(grid, i, j-1);
        }
        if (j+1 < m && grid[i][j+1] === "1") {  // 右面的1
            dfs(grid, i, j+1);
        }
    }
}
module.exports = {
    solve : solve
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务