当前位置: 首页 > 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.rkmt.cn/news/10050.html

相关文章:

  • ONCHAINID源码分析(二)
  • 鸿蒙应用开发从入门到实战(十二):ArkUI组件ButtonToggle
  • 从视觉、文案到交互:三步彻底去除产品AI味
  • 剑指offer-32、把数组排成最⼩的数
  • python微博舆情分析系统 情感分析 爬虫 机器学习 新浪微博 信息采集 大数据工艺(源码)✅
  • C# 中的 ReferenceEquals 方法 - 教程
  • 【一周AI资讯】Claude自动抓取网页;美团发布生活Agent;阿里通义发布双模型 - 详解
  • 读人形机器人20财富再分配
  • Java 与人工智能的深度融合:从数据到推理服务
  • 基于 Vite7 与 Vue3 的 WebOS 后台系统架构实践
  • pycharm环境配置
  • 为什么 TCP 是3次握手4次挥手?
  • java中的浮点数计算
  • XYCTF2025复现(WEB)
  • 发布/订阅(Publish/Subscribe)与交换机(Exchange)
  • 线性结构之链表
  • lc1033-移动石子直到连续
  • 同构系统与异构系统深度对比分析
  • # Redis内存管理与过期策略深度解析
  • 北京 意大利学签 北京意大利签证中心 贵宾 vip vfs
  • 第1周
  • 多商家在线客服系统 - 客服用户表设计方案
  • 使用python读取windows注册表
  • 当日总结
  • 3123004481
  • 使用python读取windows日志表
  • 9.20 模拟赛 T4
  • Русский язык
  • 【F#学习】布尔运算优先级
  • 深入解析:【Spark+Hive+hadoop】基于spark+hadoop基于大数据的人口普查收入数据分析与可视化系统