zoukankan      html  css  js  c++  java
  • 1254. Number of Closed Islands

    Given a 2D grid consists of 0s (land) and 1s (water).  An island is a maximal 4-directionally connected group of 0s and a closed island is an island totally (all left, top, right, bottom) surrounded by 1s.

    Return the number of closed islands.

    Example 1:

    Input: 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]]
    Output: 2
    Explanation: 
    Islands in gray are closed because they are completely surrounded by water (group of 1s).

    Example 2:

    Input: grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
    Output: 1
    

    Example 3:

    Input: 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]]
    Output: 2
    

    Constraints:

    • 1 <= grid.length, grid[0].length <= 100
    • 0 <= grid[i][j] <=1
    class Solution {
        public int closedIsland(int[][] grid) {
            int m = grid.length;
            int n = grid[0].length;        
            int res = 0;
            for(int i = 0; i < m; i++){
                for(int j = 0; j < n; j++){
                    if(grid[i][j] == 0 && i == 0 || j == 0 || i == m - 1 || j == n - 1) help(i, j, grid);
                }
            }
            for(int i = 0; i < m; i++){
                for(int j = 0; j < n; j++){
                    if(grid[i][j] == 0){
                      res++;
                      help(i, j, grid);  
                    }
                }
            }
            return res;
        }
        public void help(int r, int c, int[][] grid){
            if(r > -1 && r < grid.length && c > -1 && c < grid[0].length && grid[r][c] == 0) grid[r][c] = 1;
            else return;
            help(r + 1, c, grid);
            help(r, c + 1, grid);
            help(r - 1, c, grid);
            help(r, c - 1, grid);
        }
    }

    DFS, 先把边界的0区域全置1,然后再遍历,遇到0就先加1,然后再把该0区域置1,最后得到答案。

  • 相关阅读:
    Haskell学习笔记--class/typeclass/show/read
    Haskell学习笔记--scanl/scanr
    Haskell学习笔记--foldl/flodr/高阶函数
    EasyUI 表单验证扩展(备忘录)
    基于FPGA的视频时序生成
    如何调用Altera FPGA的内嵌乘法器
    基于FPGA视频时序生成中的库文件
    基于FPGA的序列检测器10010
    NOIP2017游记
    【NOIP模拟赛】异象石
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/11870644.html
Copyright © 2011-2022 走看看