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

力扣2132. 用邮票贴满网格图

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

这一题的大意是给出一个网格图,是一个mn的二进制矩阵,为0表示为空,为1表示为占据。现在往里面贴邮票,贴邮票的规则是:
覆盖所有空格子。
不覆盖任何被占据的格子。
我们可以放入任意数目的邮票。
邮票可以相互有重叠部分。
邮票不允许旋转 。
邮票必须完全在矩阵内 。

邮票的长宽为:stampHeight x stampWidth
现在的目标是试图往这个格子里面贴满邮票,如果可以贴满,就返回true,否则返回false。
我们根据规则,可以知道要想贴满,我们只能从一个个符合邮票的子矩阵中试,看能不能往里面贴,也即在这个子矩阵中有没有被占据的格子,如果可以,就往里面贴邮票。
根据题目上给出的数据范围,我们知道O(m
n)<=2*10^ 5 ,m,n <=2 * 10^5
因此我们只能用双重for循环,对矩阵进行遍历一次来实现目标。
暴力不行,这一题很明显可以看出需要前缀和+差分的优化,
检查子矩阵中有没有被占据的格子,可以用二维前缀和计算子矩阵的面积来表示,因为是二进制矩阵,只需要子矩阵的面积==0就表示该子矩阵是可以被贴邮票的
贴邮票的过程,我们可以用差分数组来表示,这样完美的只需要n * m的时间复杂度

   for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+grid[i-1][j-1];}}for(int i=0;i+stampHeight-1<n;i++){for(int j=0;j+stampWidth-1<m;j++){//这里应该求子矩阵的面积if(sum[i+stampHeight][j+stampWidth]-sum[i+stampHeight][j]-sum[i][j+stampWidth]+sum[i][j]==0){//说明可以放邮票d[i+1][j+1]+=1;d[i+stampHeight+1][j+1]-=1;d[i+1][j+stampWidth+1]-=1;d[i+stampHeight+1][j+stampWidth+1]+=1;}}}

然后我们只需要对差分数组进行求一个前缀和即可得到贴上邮票后的矩阵的各个值,
我们只需要表示出每一个点的差分数组的前缀和的值不大于0(说明没有被贴邮票)并且该点原本的二进制矩阵的值也为0(说明该点也没有被占据),那么就说明该点既没有被贴邮票,也没有被占据,就返回false。反之返回true
时间复杂度为O(n*m)
注意:1.在计算子矩阵的时候要注意边界条件,实际上这一题也可以参考:

力扣1895. 最大的幻方
1895只运用了二维前缀和,但我觉得思想实际上还是挺像的,本题多用了二维差分。应该还有类似的题目,我做的题目比较少。

2.差分数组的前缀和数组,并不是表示的是面积,而是每一个点经过差分后的值,因为我总把差分数组的前缀和数组用sum表示,导致曲解了它的意思。
3.这种子矩阵的题要多总结,套路实际上是一样的。

http://www.dtcms.com/a/393712.html

相关文章:

  • Halcon学习--视觉深度学习
  • LeetCode:40.二叉树的直径
  • dplyr 是 R 语言中一个革命性的数据操作包,它的名字是 “data plier“ 的缩写,意为“数据折叠器“或“数据操作器“
  • 使用Node.js和PostgreSQL构建数据库应用
  • 设计模式(C++)详解—享元模式(1)
  • C++线程池学习 Day08
  • VALUER倾角传感器坐标系的选择
  • 解决 win+R 运行处以及文件资源管理器处无法使用 wt、wsl 命令打开终端
  • R语言 生物分析 CEL 文件是 **Affymetrix 基因芯片的原始扫描文件**,全称 **Cell Intensity File**。
  • Apache Spark Shuffle 文件丢失问题排查与解决方案实践指南
  • xtuoj 0x05-C 项链
  • STM32F429I-DISC1【读取板载运动传感器数据】
  • 【Kafka面试精讲 Day 21】Kafka Connect数据集成
  • 2025数据资产管理平台深度分析:技术特性、与选型逻辑
  • RabbitMQ Java 解决消息丢失、重复和积压问题
  • 深入解析 Spring AI 系列:解析请求参数处理
  • OpenLayers地图交互 -- 章节五:捕捉交互详解
  • 阿瓦隆1566HA-448T矿机深度解析:性能、效率与冷却技术
  • 平替confluence,推荐一款国产开源免费的知识管理工具 - sward
  • 【开源】基于STM32的智能垃圾桶
  • RuoYi-Cloud问题:访问https的网关地址,实际是访问http的文件服务
  • HttpClientFactory vs new HttpClient:.NET Core HTTP 客户端的正确打开方式
  • MySQL数据库(七)—— 基于主主复制与 Keepalived 非抢占模式的高可用方案
  • 如何提高Java并发编程的实战能力?
  • JavaWeb 课堂笔记 —— 17 SpringBootWeb案例 部门管理
  • java设计模式四,原型模式
  • 【NOIP 2024 T2】遗失的赋值
  • TypeScript学习笔记1
  • Android普通应用切到后台后,多长时间会被系统回收
  • 【Elasticsearch面试精讲 Day 21】地理位置搜索与空间查询