美文网首页
1254. 统计封闭岛屿的数目

1254. 统计封闭岛屿的数目

作者: 程序员小2 | 来源:发表于2022-12-07 09:33 被阅读0次

    插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
    坚持不懈,越努力越幸运,大家一起学习鸭~~~

    题目:

    二维矩阵 grid0 (土地)和 1 (水)组成。岛是由最大的4个方向连通的 0 组成的群,封闭岛是一个 完全 由1包围(左、上、右、下)的岛。

    请返回 封闭岛屿 的数目。

    示例 1:

    image.png

    输入:grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]]
    输出:2
    解释:
    灰色区域的岛屿是封闭岛屿,因为这座岛屿完全被水域包围(即被 1 区域包围)。

    示例 2:

    image

    输入:grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
    输出:1

    示例 3:

    输入:grid = [[1,1,1,1,1,1,1],
    [1,0,0,0,0,0,1],
    [1,0,1,1,1,0,1],
    [1,0,1,0,1,0,1],
    [1,0,1,1,1,0,1],
    [1,0,0,0,0,0,1],
    [1,1,1,1,1,1,1]]
    输出:2

    提示:

    1 <= grid.length, grid[0].length <= 100
    0 <= grid[i][j] <=1

    思路:

    前置题目:200. 岛屿数量 这题和200有什么区别呢,其实就一点:存在两种不同岛屿 本题土地用0来表示,我们很容易用dfs可以遍历其中的一座岛屿,那么封闭岛屿和普通岛屿的不同点在于:

    在dfs封闭岛屿时,无法触及到边界外,因为在触及到边界外之前,就会被水域给阻拦了。 而非封闭岛屿它一定可以触及到边界外。 想清楚这一点代码就很容易写出。

    dfs返回结果为:是否为封闭岛屿,两个终止条件

    如果能够触及边界外,说明不是封闭岛屿,return false
    如果g[i][j]为水域,说明被阻拦了,return true

    注意dfs递归之间是&不是&&,&&的话就跑不过
    如果使用短路与&&的话,那么一遇到某次dfs的结果为false,短路与后面跟着的dfs就被忽略了,导致本来同属于一块岛屿的区域并没有一次遍历干净。

    java代码:

    class Solution {
        int[][] g;
        int n, m, ans;
    
        public int closedIsland(int[][] grid) {
            g = grid; n = g.length; m = g[0].length;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (g[i][j] == 0 && dfs(i, j)) ans++;
                }
            }
            return ans;
        }
        boolean dfs(int i, int j) {
            if (i < 0 || i >= n || j < 0 || j >= m) return false; // 终止条件1
            if (g[i][j] == 1) return true; // 终止条件2
            g[i][j] = 1;
            return dfs(i + 1, j) & dfs(i - 1, j) & dfs(i, j + 1) & dfs(i, j - 1);
        }
    }
    
    

    相关文章

      网友评论

          本文标题:1254. 统计封闭岛屿的数目

          本文链接:https://www.haomeiwen.com/subject/tzlnfdtx.html