1254. 统计封闭岛屿的数目

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

题目:

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

请返回 封闭岛屿 的数目。

示例 1:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NEviA8E3-1670463265258)(https://upload-images.jianshu.io/upload_images/17194554-2aaef9bb41665bc8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

输入: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:

1254. 统计封闭岛屿的数目_第1张图片
输入: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);
    }
}

你可能感兴趣的:(leetcode-数组,深度优先,算法)