LeetCode 200:岛屿数量

导读:本篇文章讲解 LeetCode 200:岛屿数量,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

链接
题目:
在这里插入图片描述
注意: 四周视为海水!

思路:回溯

之前在子集/组合、排列中的回溯框架为:
LeetCode 200:岛屿数量

岛屿问题中的回溯则不太一样;

①用两层for遍历二维数组的每个元素,第一次碰到岛屿时记录数量
②用dfs将与岛屿及其相邻的都淹没,以免重复记数
只有与岛屿之间有海水相隔开(dfs遇到海水return)的岛屿才会再被记数

为什么每次遇到岛屿都要⽤ DFS 算法把岛屿「淹了」呢?
主要是可以避免维护 visited 数组,一旦遇到 ‘0’ 就会return;

dfs的作用仅仅是将岛屿和周围「淹没」 !

Java实现:

注意

  1. 判断数组越界时, 是 i>=grid.length 而不是 i>grid.length ,i 不能等于数组长度!
  2. dfs中一定要有 if(grid[i][j]=='0'){ return; } ,即遇到海水则不需要再淹没,否则每个点都要去遍历所有元素,导致栈溢出!
class Solution {
    public int numIslands(char[][] grid) {
        int res=0;
        int m=grid.length;
        int n=grid[0].length;
        //遍历grid每个元素
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]=='1'){
                    //第一次发现岛屿则记数
                    res++;
                    //将岛屿及其相邻的都淹没,以免重复记数
                    dfs(grid,i,j);
                }
            }
        }
        return res;
    }

    void dfs(char[][] grid,int i,int j){
        int m=grid.length;
        int n=grid[0].length;
        if(i<0 || j<0 || i>=m || j>=n){ //终止条件1 : 超出边界
            return;
        }
        if(grid[i][j]=='0'){ //终止条件2 :已经是海水
            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);
        }
}

注意:终止条件1 一定在终止条件2前面 !防止数组越界 !

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89250.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!