当前位置: 首页 > news >正文

统计子岛屿的数量

统计子岛屿

题目描述

给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地)。一个 岛屿 是由 四个方向 (水平或者竖直)上相邻的 1 组成的区域。任何矩阵以外的区域都视为水域。

如果 grid2 的一个岛屿,被 grid1 的一个岛屿 完全 包含,也就是说 grid2 中该岛屿的每一个格子都被 grid1 中同一个岛屿完全包含,那么我们称 grid2 中的这个岛屿为 子岛屿 。

请你返回 grid2 中 子岛屿 的 数目 。

在这里插入图片描述
在这里插入图片描述

思路:

对于(i, j)来说,有四种情况

case1:grid1[i][j] = 1, grid2[i][j] = 1.

case2:grid1[i][j] = 1, grid2[i][j] = 0.

case3: grid1[i][j] = 0, grid2[i][j] = 1.

case4: grid1[i][j] = 0, grid2[i][j] = 0.

对于case4,我们完全不用关心;剩下的case1、case2、case3我们再看,由于是grid1包含grid2,对于case3,如果grid2是陆地,grid1是海水,那么grid1就不包含grid2,那么我们就可以提前干掉grid2中的点;对于case2,如果grid1是陆地,grid2是海水,那么grid2必然不是grid1的子岛,我们可以不做任何操作;对于case1,那么grid2必然是grid1的子岛,我们就计数,然后dfs。

下面看代码:

	public int countSubIslands(int[][] grid1, int[][] grid2) {int m = grid1.length, n = grid1[0].length, count = 0;// 先排除不是子岛屿的节点for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){if(grid2[i][j] == 1 && grid1[i][j] == 0){dfs(grid2, i, j, m, n);}}}System.out.println("======");for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){// 对于条件case1和case2来说// 这块可以优化成if(grid2[i][j] == 1)if(grid2[i][j] == 1 && grid1[i][j] == 1){count++;dfs(grid2, i, j, m, n);}}}return count;}public void dfs(int[][] grid, int i, int j, int m, int n){if(i >= m || i < 0 || j >= n || j < 0|| grid[i][j] == 0 ){return;}grid[i][j] = 0;dfs(grid, i + 1, j, m, n);dfs(grid, i - 1, j, m, n);dfs(grid, i, j + 1, m, n);dfs(grid, i, j - 1, m, n);}public static void main(String[] args) {int[][] grid1 = {{1,1,1,0,0},{0,1,1,1,1},{0,0,0,0,0},{1,0,0,0,0},{1,1,0,1,1}};int[][] grid2 = {{1,1,1,0,0},{0,0,1,1,1},{0,1,0,0,0},{1,0,1,1,0},{0,1,0,1,0}};CountSubIslands countSubIslands = new CountSubIslands();countSubIslands.countSubIslands(grid1, grid2);}
http://www.lryc.cn/news/189470.html

相关文章:

  • IntelliJ IDEA Maven 项目的依赖分析
  • 数学建模、统计建模、计量建模整体框架的理解以及建模的步骤
  • WaitGroup原理分析
  • java直播源码:如何使用Java构建一个高效的直播系统
  • Websocket获取B站直播间弹幕教程——第二篇、解包/拆包
  • 膝关节检测之1设计目标手势与物体交互的动画
  • canvas力导布局
  • 【网络安全】「漏洞原理」(二)SQL 注入漏洞之理论讲解
  • JavaScript中类的学习
  • 1600*A. Linova and Kingdom(DFS优先队列贪心)
  • gitlab git lfs的替代软件整理汇总及分析
  • IDEA 2023.2.2图文安装教程及下载
  • 第六届“中国法研杯”司法人工智能挑战赛
  • Springcloud中间件-----分布式搜索引擎 Elasticsearch
  • 基于深度学习的目标检测和语义分割:机器视觉中的最新进展
  • 微信小程序报错request:fail -2:net::ERR_FAILED(生成中间证书)
  • Ubuntu更改时区
  • 0144 文件管理
  • python psutil库之——获取网络信息(网络接口信息、网络配置信息、以太网接口、ip信息、ip地址信息)
  • uniapp上echarts地图钻取
  • scratch保护环境 2023年5月中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析
  • RPC分布式网络通信框架项目
  • Navicat如何连接远程服务器的MySQL
  • 【计算机网络笔记】计算机网络的结构
  • 排序算法-插入排序法(InsertSort)
  • RuntimeError: “slow_conv2d_cpu“ not implemented for ‘Half‘
  • 前端 | 前端工程化
  • 学信息系统项目管理师第4版系列24_整合管理
  • 轻量级虚拟化技术草稿
  • bootz启动 Linux内核过程中涉及的 do_bootm_states 函数