【每日一题】用邮票贴满网格图

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:二维前缀和+二维差分
  • 写在最后

Tag

【二维前缀和】【二维差分】【矩阵】【2023-12-14】


题目来源

2132. 用邮票贴满网格图


题目解读

在 01 矩阵中,判断是否可以用给定尺寸的邮票将所有 0 位置都覆盖住,邮票之间可以重叠但是不能超出矩阵的的边缘。如果可以返回 true,否则返回 false。


解题思路

方法一:二维前缀和+二维差分

思路

我们贪心的进行覆盖,只要有足够大的空格(邮票尺寸那么大没被占据的)的地方,我们就用邮票来覆盖。记录空格被多少张邮票覆盖了,如果最后存在空格子没被覆盖,则返回 false,否则返回 true。

具体流程如下:

  • 枚举邮票尺寸大小的矩形,需要使用二维前缀和判断枚举的区域是否没被占据;
  • 记录空格被多少张邮票覆盖了,使用二维差分记录;
  • 统计是否存在空格子没被覆盖,如是则返回 false,否则返回 true,使用二维差分还原。

二维前缀和

如何判断某个矩形区域可以覆盖邮票?只要该区域内没有被占据就可以,即一个矩形区域的元素和等于 0。为此,我们使用二维前缀和 O ( 1 ) O(1) O(1) 的统计任意矩阵区域的元素和。

这里直接贴出代码,如果对二维前缀和内容不熟悉可以参考 一文讲清楚【前缀和】。

vector<vector<int>> preSum2d(m+1, vector<int>(n+1));
for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {preSum2d[i+1][j+1] = preSum2d[i][j+1] + preSum2d[i+1][j] - preSum2d[i][j] + grid[i][j];}
}

二维差分

实现代码

class Solution {
public:bool possibleToStamp(vector<vector<int>>& grid, int stampHeight, int stampWidth) {int m = grid.size(), n = grid[0].size();vector<vector<int>> preSum2d(m+1, vector<int>(n+1));for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {preSum2d[i+1][j+1] = preSum2d[i][j+1] + preSum2d[i+1][j] - preSum2d[i][j] + grid[i][j];}}vector<vector<int>> diff(m+2, vector<int>(n+2));for (int i2 = stampHeight; i2 <= m; ++i2) {for (int j2 = stampWidth; j2 <= n; ++j2) {int i1 = i2 - stampHeight + 1;int j1 = j2 - stampWidth + 1;if (preSum2d[i2][j2] - preSum2d[i2][j1-1] - preSum2d[i1-1][j2] + preSum2d[i1-1][j1-1] == 0) {diff[i1][j1] ++;diff[i1][j2+1] --;diff[i2+1][j1] --;diff[i2+1][j2+1] ++;}}}for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {diff[i+1][j+1] += diff[i+1][j] + diff[i][j+1] - diff[i][j];if (grid[i][j] == 0 && diff[i+1][j+1] == 0) {return false;}}}return true;}
};

复杂度分析

时间复杂度: O ( m n ) O(mn) O(mn) m m m n n n 分别为数组 grid 的行数和列数。

空间复杂度: O ( m n ) O(mn) O(mn)


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/222001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能优化算法应用:基于黄金正弦算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黄金正弦算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黄金正弦算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黄金正弦算法4.实验参数设定5.算法结果6.…

GeoTrust OV证书

当谈到网站安全性和可信度时&#xff0c;GeoTrust OV证书是一个备受推崇的选择。作为一家备受尊敬的数字证书颁发机构&#xff0c;GeoTrust以其卓越的品牌声誉和高质量的产品而闻名于世。GeoTrust OV证书提供了一系列的安全功能&#xff0c;同时还具有出色的性价比&#xff0c;…

再探再报:SQL中的关联查询

在 SQL 中进行关联查询&#xff08;或称联接查询&#xff09;时&#xff0c;有几种不同的语法来执行这些查询&#xff0c;常见的包括&#xff1a; 使用 JOIN 关键字&#xff1a;JOIN 关键字可与不同类型的联接组合使用&#xff0c;如 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL …

DPDK多进程之间的通信

文章目录 前言本机DPDK IPC API介绍demo演示 前言 DPDK的主进程和辅助进程之间共享大页内存。关于DPDK多进程的支持文档介绍见&#xff1a;47. 多进程支持。 本文介绍本机DPDK的主进程和辅助进程之间交换短消息的API的使用。 前置要求&#xff1a;DPDK-Hello-World示例应用程…

系统级基础信号知识【Linux】

目录 一&#xff0c;什么是信号 进程面对信号常见的三种反应概述 二&#xff0c;产生信号 1.终端按键产生信号 signal 2. 进程异常产生信号 核心转储 3. 系统调用函数发送信号 kill raise abort 小结&#xff1a; 4. 由软件条件产生 alarm 5. 硬件异常产生信号…

解锁MSSQL存储过程优化之道:参数化查询的技术深度探究

数据库是现代应用的支柱&#xff0c;而MSSQL作为其中的瑞士军刀&#xff0c;其性能直接关系到系统的稳定与响应速度。本文将带领读者深入探讨MSSQL存储过程优化的精髓之一——参数化查询。跟随着我们的脚步&#xff0c;你将领悟到优化的本质&#xff0c;发现隐藏在参数化查询背…

WEB服务器介绍

Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器连到服务器上并请求文件时&#xff0c;服务器将处理该请求并将文件发送到该浏览器上&#xff0c;附带的信息会告诉浏览器如何查看该文件&#xff0c;即文WEB服务器件类型。服务器使用HTTP进行信息交流&#xff0c…

Java之异常

一、异常是什么 程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 注意&#xff1a;异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行. 二、异常体系 三、异常的分类 &#xff08;一&#xff09;、编译时…

明懿金汇应对气候变化:投资于绿色未来

2023年&#xff0c;面对全球范围内的气候变化和环境保护挑战&#xff0c;明懿金汇积极响应&#xff0c;展现出其在可持续金融领域的领导力。作为一家前沿的金融科技公司&#xff0c;明懿金汇不仅将环保理念融入到其金融产品和服务中&#xff0c;更通过直接的行动和投资&#xf…

【Python】conda镜像配置,.condarc文件详解,channel镜像

1. conda 环境 安装miniconda即可&#xff0c;Miniconda 安装包可以到 http://mirrors.aliyun.com/anaconda/miniconda/ 下载。 .condarc是conda 应用程序的配置文件&#xff0c;在用户家目录&#xff08;windows&#xff1a;C:\users\username\&#xff09;&#xff0c;用于…

PHP的协程是什么?

PHP 的协程是一种轻量级的线程&#xff08;或任务&#xff09;实现&#xff0c;允许在一个进程中同时执行多个协程&#xff0c;但在任意时刻只有一个协程处于执行状态。协程可以看作是一种用户空间线程&#xff0c;由程序员显式地管理&#xff0c;而不是由操作系统内核进行调度…

用提问的方式来学习:冯·诺伊曼体系结构与操作系统OS

学习冯诺伊曼体系结构之前&#xff0c;我们要本着两个问题来学习&#xff1a; 什么是冯诺伊曼体系结构&#xff1f;为什么要有冯诺伊曼体系结构&#xff1f; 一、冯诺伊曼体系结构 1. 什么是冯诺伊曼体系结构&#xff1f; 那我们就先来回答一下什么是冯诺伊曼体系结构&#x…

Python中的TesserOCR:文字识别的全方位指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 文字识别在图像处理领域中起到了至关重要的作用&#xff0c;而TesserOCR&#xff08;Tesseract OCR的Python封装&#xff09;为开发者提供了一个强大的工具&#xff0c;使得文字识别变得更加便捷。本文将通过详细…

Matlab示例-Examine 16-QAM Using MATLAB学习笔记

​工作之余学习16-QAM 写在前面 网上看到许多示例&#xff0c;但一般都比较难以跑通。所以&#xff0c;还是老方法&#xff0c;先将matlab自带的例子研究下。 Examine 16-QAM Using MATLAB Examine 16-QAM Using MATLAB 或者&#xff0c;在matlab中&#xff0c;键入&#x…

Spring框架-GOF代理模式之JDK动态代理

我们可以分成三步来完成jdk动态代理的实现 第一步&#xff1a;创建目标对象 第二步&#xff1a;创建代理对象 第三步&#xff1a;调用代理对象的代理方法 public class Client {public static void main(String[] args) {//创建目标对象final OrderService target new OrderS…

C语言数据结构-二叉树的入门

文章目录 0 碎碎念1 二叉树的概念和结构1.1 概念和特点1.2 结构1.3 特殊的二叉树1.4 二叉树的存储与性质1.5 前序、中序和后序 2 简单二叉树的实现2.1 定义数据结构类型2.2 前序、中序和后序接口的实现2.3 二叉树中节点的个数2.4 叶子节点的个数 3 完整代码块3.1 BinaryTree.h3…

「神印王座」皓晨带伙伴参与伊老试炼,12魔神攻打震南关,高能

Hello,小伙伴们&#xff0c;我是拾荒君。 时光匆匆&#xff0c;国漫《神印王座》的第85集已经与大家如约而至。想必各位观众都已经迫不及待地观看了这一集&#xff0c;其中&#xff0c;龙皓晨向光之晨曦团的成员们揭示了永恒之塔的秘密&#xff0c;并带领他们深入其中。 永恒之…

Java实现pdf文件合并

在maven项目中引入以下依赖包 <dependencies><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-examples</artifactId><version>3.0.1</version></dependency><dependency><groupId>co…

全志V3s之显示当前文件路径

新移植的kernel和根文件系统&#xff0c;其终端显示只有一个#号&#xff0c;不方便查看&#xff0c;更改以下配置&#xff0c;使得可以显示全路径。修改如下&#xff1a; export PS1[\u\h \w]\$这个是即时生效的&#xff0c;所以如果要重启或者重新打开窗口也生效的话就要把这…

nginx服务前端访问查看无响应的问题

问题 nginx 启动之后&#xff0c;前端访问无数据&#xff0c;F12 查看&#xff0c;提示挂起。 以为是配置问题&#xff0c;查看配置文件&#xff0c;未发现配置的有问题。 原因 通过查看配置文件&#xff0c;发现转发的服务地址为127.0.0.1&#xff0c;手动ping 127.0.0.1&a…