LeetCode 2132. 用邮票贴满网格图:二维前缀和 + 二维差分

【LetMeFly】2132.用邮票贴满网格图:二维前缀和 + 二维差分

力扣题目链接:https://leetcode.cn/problems/stamping-the-grid/

给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据)。

给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩阵中,且满足以下 限制 和 要求 :

  1. 覆盖所有  格子。
  2. 不覆盖任何 被占据 的格子。
  3. 我们可以放入任意数目的邮票。
  4. 邮票可以相互有 重叠 部分。
  5. 邮票不允许 旋转 。
  6. 邮票必须完全在矩阵  。

如果在满足上述要求的前提下,可以放入邮票,请返回 true ,否则返回 false 。

 

示例 1:

输入:grid = [[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0]], stampHeight = 4, stampWidth = 3
输出:true
解释:我们放入两个有重叠部分的邮票(图中标号为 1 和 2),它们能覆盖所有与空格子。

示例 2:

输入:grid = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]], stampHeight = 2, stampWidth = 2 
输出:false 
解释:没办法放入邮票覆盖所有的空格子,且邮票不超出网格图以外。

 

提示:

  • m == grid.length
  • n == grid[r].length
  • 1 <= m, n <= 105
  • 1 <= m * n <= 2 * 105
  • grid[r][c] 要么是 0 ,要么是 1
  • 1 <= stampHeight, stampWidth <= 105

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

二维前缀和预处理好后,可以在 O ( 1 ) O(1) O(1)的时间内查出任意矩形的所有元素之和。( p r e f i x [ i + 1 ] [ j + 1 ] prefix[i + 1][j + 1] prefix[i+1][j+1] m a t [ i ] [ j ] mat[i][j] mat[i][j]及其左上角所有元素组成的矩阵的和)

若矩形内每个元素都加d,则可以在 O ( 1 ) O(1) O(1)的时间内记录到差分数组中。最后能以 O ( m n ) O(mn) O(mn)的时间还原出原数组。(按求前缀和的方式对差分数组计算,即可得到原矩阵)

因为贴邮票的次数不限,因此我们决定:能贴的下就贴。最后,看看是否还有空格即可。

具体思路:

消耗 O ( m n ) O(mn) O(mn)的时间计算出前缀和数组。

遍历矩阵中的每个空白位置,若以这个位置为左上角可以贴邮票(通过前缀和能很快确认),则贴邮票(通过差分数组能很快记录)。

最终再消耗 O ( m n ) O(mn) O(mn)的时间还原出贴发票后的矩阵。

  • 时间复杂度 O ( s i z e ( g r i d ) ) O(size(grid)) O(size(grid))
  • 空间复杂度 O ( s i z e ( g r i d ) ) O(size(grid)) O(size(grid))

AC代码

C++
class Solution {
public:bool possibleToStamp(vector<vector<int>>& grid, int h, int w) {int n = grid.size(), m = grid[0].size();vector<vector<int>> prefix(n + 1, vector<int>(m + 1)), diff(n + 2, vector<int>(m + 2));// prefixfor (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {prefix[i + 1][j + 1] = grid[i][j] + prefix[i][j + 1] + prefix[i + 1][j] - prefix[i][j];}}// stampfor (int i = 0; i + h - 1 < n; i++) {for (int j = 0; j + w - 1 < m; j++) {// (i, j) -> (i + h - 1, j + w - 1)if (!grid[i][j] && !(prefix[i + h][j + w] - prefix[i + h][j] - prefix[i][j + w] + prefix[i][j])) {diff[i + 1][j + 1]++;diff[i + 1][j + w + 1]--;diff[i + h + 1][j + 1]--;diff[i + h + 1][j + w + 1]++;}}}// un-difffor (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {diff[i + 1][j + 1] += diff[i][j + 1] + diff[i + 1][j] - diff[i][j];if (!grid[i][j] && !diff[i + 1][j + 1]) {return false;}}}return true;}
};
Python
# from typing import Listclass Solution:def possibleToStamp(self, grid: List[List[int]], h: int, w: int) -> bool:n, m = len(grid), len(grid[0])prefix = [[0] * (m + 1) for _ in range(n + 1)]diff = [[0] * (m + 2) for _ in range(n + 2)]# get-prefixfor i in range(n):for j in range(m):prefix[i + 1][j + 1] = grid[i][j] + prefix[i + 1][j] + prefix[i][j + 1] - prefix[i][j]# stampfor i in range(n - h + 1):for j in range(m - w + 1):# (i, j) -> (i + h - 1, j + w - 1)if not grid[i][j] and not (prefix[i + h][j + w] + prefix[i][j] - prefix[i + h][j] - prefix[i][j + w]):diff[i + 1][j + 1] += 1diff[i + h + 1][j + 1] -= 1diff[i + 1][j + w + 1] -= 1diff[i + h + 1][j + w + 1] += 1# un-difffor i in range(n):for j in range(m):diff[i + 1][j + 1] += diff[i + 1][j] + diff[i][j + 1] - diff[i][j]if not grid[i][j] and not diff[i + 1][j + 1]:return Falsereturn True

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/135002925

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

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

相关文章

ABAP 锁对象问题,针对条目数锁不住解决方法

使用通过锁表函数 ENQUEUE_E_TABLE 针对 函数 varkey 入参&#xff0c;锁表 SFLIGHT varkey |{ sy-mandt }{ |AA| }{ |0017| }{ |20210916| }|. 直接拼接主键就会出现锁表条目数锁不住的情况&#xff0c;SE11、SE16还可编辑 需要改进写法 像下面这样赋值即可针对行项目数…

大模型应用_PrivateGPT

https://github.com/imartinez/privateGPT 1 功能 整体功能&#xff0c;想解决什么问题 搭建完整的 RAG 系统&#xff0c;与 FastGPT相比&#xff0c;界面比较简单。但是底层支持比较丰富&#xff0c;可用于知识库的完全本地部署&#xff0c;包含大模型和向量库。适用于保密级…

静态html网页,怎么增加后台管理

要为静态HTML网页增加后台管理功能&#xff0c;你可以考虑以下几种方法&#xff1a; 服务器端脚本&#xff1a;使用服务器端脚本语言&#xff08;如PHP、Python等&#xff09;来处理后台管理功能。你可以将静态HTML页面与服务器端脚本结合起来&#xff0c;通过在HTML页面中嵌入…

在MFC(Microsoft Foundation Classes)中 CreateThread函数

CreateThread是Windows API中用于创建新线程的函数。以下是对函数参数的详细解释&#xff1a; lpThreadAttributes&#xff08;可选&#xff09;&#xff1a;指向SECURITY_ATTRIBUTES结构的指针&#xff0c;用于指定线程的安全性。可以设置为NULL&#xff0c;表示使用默认安全…

AI抽烟识别系统研发关键

为了设计一个有效的AI抽烟识别系统&#xff0c;我们需要考虑几个关键组成部分&#xff1a;图像捕捉、数据处理、模型训练、以及实际应用场景。下面是这个方案的详细阐述&#xff1a; 1. 图像捕捉与数据收集 摄像头部署&#xff1a;首先&#xff0c;在需要监控的区域安装高分辨…

硬件基础常识【4】--利用戴维宁定理求运放复杂反馈电阻网络的增益

最近学到了一种求带T型电阻网络反馈运放增益的方法 如图所示为T型电阻网络反馈的反相放大器 求解思路 沿X-Y断开&#xff0c;右侧利用戴维宁定理等效成电压源串电阻的形式 由戴维宁定理可得&#xff1a; V T H V o u t ∗ R 4 / ( R 3 R 4 ) ( 式 1 ) VTHVout*R4/(R3R4)…

二叉树题目:从前序遍历还原二叉树

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;从前序遍历还原二叉树 出处&#xff1a;1028. 从前序遍历还原二叉树 难度 6 级 题目描述 要求 我们从二叉树的根结点 root \texttt{root} root 开…

5键键盘的输出 - 华为OD统一考试

OD统一考试 题解&#xff1a; Java / Python / C 题目描述 有一个特殊的 5键键盘&#xff0c;上面有 a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键。 a 键在屏幕上输出一个字母 a; ctrl-c 将当前选择的字母复制到剪贴板; ctrl-x 将当前选择的 字母复制到剪贴板&#xff0c;并清空选择…

机器视觉【1】相机的成像(畸变)模型

零、前言 很久没写文章&#xff0c;简单唠一唠。 不知道巧合还是蜀道同归&#xff0c;部门领导设定了些研究课题&#xff0c;用于公司部门员工的超前发展&#xff0c;该课题是“2D to 3D的三维重建”&#xff0c;这一块刚好是我个人看中的一个大方向&#xff0c;所以就有了这…

leetcode-21-合并两个有序链表(C语言实现)

题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出…

有了 webapi 后 webService 被淘汰了吗?

现在和外部系统通讯都是通过webapi来提供接口供给调用方来调用&#xff0c;基本很少使用webservice了&#xff0c;记得最后一次写webservice接口还是三年前&#xff0c;是不是webservice被淘汰了&#xff0c;我们来具体看下。 对于webService&#xff0c;该服务协议为SOAP(简单…

一文读懂FastAPI:Python 开发者的福音

FastAPI是一个基于Python的现代化Web框架&#xff0c;它提供了快速、简单和高性能的方式来构建API。 它结合了Python的静态类型检查和自动化文档生成的功能&#xff0c;使得开发API变得更加容易和高效。 下面将介绍如何使用FastAPI快速开发接口&#xff0c;并且利用自动生成的…

《LeetCode力扣练习》代码随想录——字符串(KMP算法学习补充——针对next数组构建的回退步骤进行解释)

《LeetCode力扣练习》代码随想录——字符串&#xff08;KMP算法学习补充——针对next数组构建的回退步骤进行解释&#xff09; 学习路径 代码随想录&#xff1a;28. 实现 strStr() CSDN&#xff1a;【详解】KMP算法——多图&#xff0c;多例子&#xff08;c语言&#xff09; …

【Effective C++】【Accustoming yourself to C++】

文章目录 term1:View Cas a federation of languages&#xff08;1&#xff09;C&#xff08;2&#xff09;Object-Oriented C&#xff08;3&#xff09;Template C&#xff08;4&#xff09;STL term2:Prefer const,enums,inlines to #defines&#xff08;1&#xff09;const:…

【Qt之QNetworkAccessManager】概述及示例

概述 QNetworkAccessManager类允许应用程序发送网络请求和接收应答 网络访问API是围绕一个QNetworkAccessManager对象构建的&#xff0c;该对象为它发送的请求保存通用配置和设置。它包含代理和缓存配置&#xff0c;以及与此类问题相关的信号&#xff0c;以及可用于监视网络操…

Antd Select 添加中框

默认antd 的 Select中间并没有竖框&#xff0c;但是ui design设计了&#xff0c;所以记录一下如何添加 默认&#xff1a; CSS&#xff1a; .custom-select-suffix-icon {display: flex;align-items: center; }.custom-select-suffix-icon::before {content: ;height: 31px; …

持续学习动态架构算法LwF(Learning without Forgetting )解读总结与代码注释

0.持续学习 持续学习相关文章汇总&#xff0c;包含论文地址、代码地址、具体分析解读地址 1.LwF算法相关链接 论文地址代码地址 2.基本想法 针对问题&#xff1a;在无法获得原始任务训练数据的情况下&#xff0c;适合使视觉系统适应新任务&#xff0c;并且保证其在旧任务上…

在Vue开发中v-if指令和v-show指令的使用介绍和区别及使用场景

一、条件渲染 v-if v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值时才被渲染。 <h1 v-if"awesome">Vue is awesome!</h1>v-else 你也可以使用 v-else 为 v-if 添加一个“else 区块”。 <h1 v-if"awesome"&g…

什么品牌的猫粮比较好?主食冻干猫粮品牌十大排行

咱们养猫人每天最愁的就是咋给自家猫咪选一款优质的猫粮&#xff0c;让猫主子吃了健健康康的。早些年大多养猫人的标准就是盯着进口的买&#xff0c;所以之前进口猫粮的销量一直遥遥领先&#xff0c;感觉品控也严&#xff0c;也就放心大胆的冲进口猫粮了&#xff0c;但近期百利…

34.用过JavaConfig方式的spring配置吗?它是如何替代xml的?

用过JavaConfig方式的spring配置吗?它是如何替代xml的? 基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件。 以@Configuration 注解为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。 另一个例子是@Bean注解,它…