【算法】Number of Closed Islands 统计封闭岛屿的数目

这篇具有很好参考价值的文章主要介绍了【算法】Number of Closed Islands 统计封闭岛屿的数目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Number of Closed Islands 统计封闭岛屿的数目

问题描述:

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

请返回 封闭岛屿 的数目。

行,列范围[1,100] , g r i d [ i ] [ j ] grid[i][j] grid[i][j]==0OR1

分析

问题要求封闭island的数量,就是找出完全被1包围的0

非常典型的矩阵遍历。
思路比较多

  • 首先就是对每个0出现的位置开始 B F S BFS BFS或者 D F S DFS DFS遍历,把能达到的0全部找出来,这样就是一个 i s l a n d island island,这个island不一定是封闭的,要么在遍历完成后,得到确切的结果, i s l a n d island island是否封闭,要么在遍历时就保证该坐标所属的 i s l a n d island island一定是封闭的。
  • 其次,如果不对坐标记录,那么在遍历的过程中可能会遇到之前的坐标0,可以使用标记数组,也可以直接修改访问过的0.

所以不同的处理方式,导致的整体结构流程会有差异。但是时间复杂度上,基本是相同的。

可以把所有边界 b o u n d a r y boundary boundary上的 0 0 0,都进行标记为 x , x ! = 0 ∣ ∣ 1 x,x!=0||1 x,x!=0∣∣1,使用 D F S DFS DFS或者 B F S BFS BFS都可以。
到此,矩阵中剩余的0一定属于封闭island,然后依次遍历所有的坐标,到达一个0值坐标后,进行DFS或者BFS,为了将island进行标记,同时ans++。最终返回结果。

代码

int[][] dir = new int[][]{{0,1},{1,0},{0,-1},{-1,0}};
    int rows,cols;
    int[][] g;
    public int closedIsland(int[][] grid) {
        rows = grid.length;
        cols = grid[0].length;
        g = grid;
        for(int i = 0;i<rows;i++){ 
            if(g[i][0]==0) color(i,0);            
            if(g[i][cols-1]==0) color(i,cols-1);
        }
        for(int i = 0;i<cols;i++){             
            if(g[0][i]==0) color(0,i);
            if(g[rows-1][i]==0) color(rows-1,i);
        }
        int ans =0;
        for(int i = 0;i<rows;i++){
            for(int j = 0;j<cols;j++){
                if(g[i][j]!=0) continue;
                color(i,j);
                ans++;
            }
        }
        return ans;    
    }

    public void color(int x,int y){
        Queue<int[]> queue = new LinkedList();
        queue.offer(new int[]{x,y});
        while(!queue.isEmpty()){
            int len = queue.size();
            for(int i = 0;i<len;i++){
                int[] cordi = queue.poll();
                g[cordi[0]][cordi[1]] = 2;// is visted
                for(int k = 0;k<4;k++){
                    int nx = cordi[0]+dir[k][0];    
                    int ny = cordi[1]+dir[k][1];    
                    if(nx<0||nx>=rows) continue;
                    if(ny<0||ny>=cols) continue;
                    if(g[nx][ny]!=0)continue;
                    queue.offer(new int[]{nx,ny});
                }
            }
        }
        return;
    }

时间复杂度O(mn)

空间复杂度O(mn)

当然并查集也能做,暂时懒得写了,有时间再加吧。

Tag

Matrix BFS文章来源地址https://www.toymoban.com/news/detail-496276.html

到了这里,关于【算法】Number of Closed Islands 统计封闭岛屿的数目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于岛屿的三道leetcode原题:岛屿周长、岛屿数量、统计子岛屿

    题1: 岛屿周长 给定一个 row x col 的二维网格地图 grid ,其中:gridi = 1 表示陆地, gridi = 0 表示水域。 网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。 岛屿

    2024年02月10日
    浏览(51)
  • leetcode2719. 统计整数数目

    Problem: 2719. 统计整数数目 给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数: num1 = x = num2 min_sum = digit_sum(x) = max_sum. 请你返回好整数的数目。答案可能很大,请返回答案对 109 + 7 取余后的结果。 注意,d

    2024年01月18日
    浏览(51)
  • 「数位dp」统计整数数目(力扣第2719题)

    本题为1月16日力扣每日一题 题目来源:力扣第2719题 题目tag: 数位dp 动态规划 给你两个数字字符串num1和num2,以及两个整数max_sum和min_sum。如果一个整数x满足以下条件,我们称它是一个好整数: (num1 leq x leq num2) (min_sum leq digit_sum(x) leq max_sum) 请你返回好整数的数目。答案

    2024年01月16日
    浏览(38)
  • 区间合并|LeetCode2963:统计好分割方案的数目

    【动态规划】【广度优先】LeetCode2258:逃离火灾 区间合并 给你一个下标从 0 开始、由 正整数 组成的数组 nums。 将数组分割成一个或多个 连续 子数组,如果不存在包含了相同数字的两个子数组,则认为是一种 好分割方案 。 返回 nums 的 好分割方案 的 数目。 由于答案可能很

    2024年02月03日
    浏览(41)
  • LeetCode 2719. 统计整数数目,数位dp板子题

    1、题目描述 给你两个数字字符串  num1  和  num2  ,以及两个整数  max_sum  和  min_sum  。如果一个整数  x  满足以下条件,我们称它是一个好整数: num1 = x = num2 min_sum = digit_sum(x) = max_sum . 请你返回好整数的数目。答案可能很大,请返回答案对  109 + 7  取余后的结果。 注意

    2024年01月17日
    浏览(43)
  • LeetCode2444: 统计定界子数组的数目

    【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值 给你一个整数数组 nums 和两个整数 minK 以及 maxK 。 nums 的定界子数组是满足下述条件的一个子数组: 子数组中的 最小值 等于 minK 。 子数组中的 最大值 等于 maxK 。 返回定界子数组的数目。 子数组是数组中的一个连续部

    2024年02月01日
    浏览(35)
  • [leetcode~数位动态规划] 2719. 统计整数数目 hard

    给你两个数字字符串 num1 和 num2 ,以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数: num1 = x = num2 min_sum = digit_sum(x) = max_sum. 请你返回好整数的数目。答案可能很大,请返回答案对 109 + 7 取余后的结果。 注意,digit_sum(x) 表示 x 各位数字之

    2024年01月18日
    浏览(42)
  • 力扣刷题第二天 统计整数数目(每天一题)

    统计整数数目 给你两个数字字符串  num1  和  num2  ,以及两个整数  max_sum  和  min_sum  。如果一个整数  x  满足以下条件,我们称它是一个好整数: num1 = x = num2 min_sum = digit_sum(x) = max_sum . 请你返回好整数的数目。答案可能很大,请返回答案对  109 + 7  取余后的结果。 注

    2024年01月16日
    浏览(38)
  • 【图论】【分类讨论】LeetCode3017按距离统计房屋对数目

    图论 分类讨论 【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中,存在编号从 1 到 n 的房屋,由 n 条街道相连。对所有 1 = i n ,都存在一条街道连接编号为 i 的房屋与编号为 i + 1 的房屋。另存在一条街道连接编

    2024年04月13日
    浏览(31)
  • 2023-08-23 LeetCode每日一题(统计点对的数目)

    点击跳转到题目位置 给你一个无向图,无向图由整数 n ,表示图中节点的数目,和 edges 组成,其中 edges[i] = [u i , v i ] 表示 u i 和 v i 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。 第 j 个查询的答案是满足如下条件的点对 (a, b) 的数目: a b cnt 是与 a 或者 b

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包