目录

1. 题目描述

2. 解题分析

3. 代码实现


1. 题目描述

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

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

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

示例 1:

输入: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]], 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]]
输出:3
解释:如上图所示,左边为 grid1 ,右边为 grid2 。
grid2 中标红的 1 区域是子岛屿,总共有 3 个子岛屿。

示例 2:

输入:grid1 = [[1,0,1,0,1],[1,1,1,1,1],[0,0,0,0,0],[1,1,1,1,1],[1,0,1,0,1]], grid2 = [[0,0,0,0,0],[1,1,1,1,1],[0,1,0,1,0],[0,1,0,1,0],[1,0,0,0,1]]
输出:2
解释:如上图所示,左边为 grid1 ,右边为 grid2 。
grid2 中标红的 1 区域是子岛屿,总共有 2 个子岛屿。

提示:

  • m == grid1.length == grid2.length
  • n == grid1[i].length == grid2[i].length
  • 1 <= m, n <= 500
  • grid1[i][j] 和 grid2[i][j] 都要么是 0 要么是 1 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-sub-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题分析

比前几个岛屿问题上了一点难度。

考虑先对grid2进行岛屿搜索,当找到一个岛屿后,记录岛屿所包含的所有格点坐标,然后在grid1中查询所有这些格点坐标是否也同为陆地,如果是的话则记为一个子岛屿。

在grid2中搜索岛屿与之前的岛屿搜索问题一样可以采用广度优先搜索或者深度优先搜索。

具体算法可以参考leetcode200, 695,1254, 1020等(Leetcode0200. 岛屿数量(medium)),此处不再赘述。

3. 代码实现

from typing import List
from collections import dequeclass Solution:def countSubIslands(self, grid1: List[List[int]], grid2: List[List[int]]) -> int:if len(grid2)==0 or len(grid2[0])==0:return 0R,C          = len(grid2),len(grid2[0])subIslandCnt = 0for r in range(len(grid2)):for c in range(len(grid2[0])):                if grid2[r][c] == 1:island = [(r,c)]q = deque([(r,c)])grid2[r][c] = 0while len(q)>0:# (r0,c0) = q.popleft() # Used as queue, to implement BFS(r0,c0) = q.pop() # Used as stack, to implement DFSfor x,y in [(r0-1,c0),(r0+1,c0),(r0,c0-1),(r0,c0+1)]:if 0<=x<R and 0<=y<C and grid2[x][y]==1:island.append((x,y))q.append((x,y))grid2[x][y] = 0# check whether this island is a sub-island of grid1print(island)isSubIsland = Truefor xy in island:if grid1[xy[0]][xy[1]] == 0:isSubIsland = Falsebreakif isSubIsland:subIslandCnt += 1return subIslandCntif __name__ == '__main__':sln = Solution()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]]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]]print(sln.countSubIslands(grid1,grid2))  grid1 = [[1,0,1,0,1],[1,1,1,1,1],[0,0,0,0,0],[1,1,1,1,1],[1,0,1,0,1]]grid2 = [[0,0,0,0,0],[1,1,1,1,1],[0,1,0,1,0],[0,1,0,1,0],[1,0,0,0,1]]print(sln.countSubIslands(grid1,grid2))

执行用时:728 ms, 在所有 Python3 提交中击败了62.62%的用户

内存消耗:23 MB, 在所有 Python3 提交中击败了78.60%的用户

回到本目录: 笨牛慢耕的Leetcode解题笔记(动态更新。。。)

Leetcode1905. 统计子岛屿(medium)相关推荐

  1. LeetCode 1905. 统计子岛屿

    LeetCode 1905. 统计子岛屿 题目 思路 代码 题目 链接: https://leetcode.cn/problems/count-sub-islands/ 给你两个 m x n 的二进制 ...

  2. 1905. 统计子岛屿-深度优先遍历图

    1905. 统计子岛屿-深度优先遍历图 给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地).一个 岛屿 是由 四个方向 (水平或者竖直) ...

  3. 【深度优先搜索】leetcode 1905. 统计子岛屿

    1905. 统计子岛屿 文章目录 题目描述 示例1: 示例2: 提示 方法:深度优先搜索 解题思路 代码 复杂度分析 题目描述 给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只 ...

  4. 剑指 Offer 15. 二进制中1的个数 and leetcode 1905. 统计子岛屿

    题目 请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...

  5. LeetCode 1905. 统计子岛屿(BFS)

    文章目录 1. 题目 2. 解题 1. 题目 给你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地). 一个 岛屿 是由 四个方向 (水平或 ...

  6. 1905 统计子岛屿

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

  7. leetcode 1905. 统计子岛屿(C++、java、python)

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

  8. leetcode day 2 【1905. 统计子岛屿】 BFS/DFS

    解题思路 BFS 找到grid2中的每一座岛屿[暴力搜索整个grid矩阵],对每座岛屿BFS,过程中check岛屿格子是否在grid1中为岛屿. class Solution:def countSub ...

  9. 【广度优先搜索-中等】1905. 统计子岛屿

    [题目] [代码] [方法1]深度优先 class Solution:def countSubIslands(self, grid1: List[List[int]], grid2: List[Lis ...

最新文章

  1. Python+Django+Ansible Playbook自动化运维项目实战(二)
  2. c web文件服务器,使用C++制作简单的web服务器(续).pdf
  3. EventLoop 的启动
  4. 如何设计第三方账号登陆?
  5. mac中打开nginx位置
  6. mysql 5.7.18源码包下载_MYSQL数据库CentOS6.9+Mysql5.7.18源码安装详细教程
  7. java位运算(、|、 ~、、 、 ^)
  8. android webview 弹出浏览器,android – 防止WebView打开浏览器
  9. xshell 登录kail拒绝了密码 已解决
  10. pro git学习笔记 4
  11. Window10系统下通过SMB协议连接和断开资源服务器
  12. 也来聊聊Spring中的IOC和AOP
  13. NLP-文本摘要:“文本摘要”综述(Text Summarization)
  14. USRPx310的射频板UBX160
  15. Android 权限适配 从此第三方系统新增的权限无法判断状态的问题得到解决! 如MIUI自启动, 后台弹出界面权限等
  16. python抓取豆瓣电影
  17. 信号完整性(SI)电源完整性(PI)学习笔记(二十)传输线的串扰(四)
  18. 【1383】手机短号(多实例测试)
  19. matlab接触刚度编程,关于接触刚度的定义
  20. 数据挖掘算法之时间序列算法(平稳时间序列模型,AR(p),MA(q),(平稳时间序列模型,AR(p),MA(q),ARMA(p,q)模型和非平稳时间序列模型,ARIMA(p,d,q)模型)学习笔记梳理

热门文章

  1. 第39次Scrum会议(12/5)【欢迎来怼】
  2. 刀片服务器改台式电脑_详解刀片服务器如何走向融合
  3. java xlsx转html
  4. 3050显卡驱动安装+配置pytorch的cuda环境
  5. 小程序Icon图标的几种实现方案
  6. python 费马检测
  7. java-不死神兔百钱百鸡
  8. 《心流:最优体验心理学》读书笔记
  9. 测试类型-- 按测试对象分 ※
  10. U-Boot参数设置 .