LeetCode 每日一题 Day 12 (Hard)|| 二维前缀和二维差分

news2024/9/28 15:21:43

2132. 用邮票贴满网格图

给你一个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

这道题目实在不会做,搬运了灵神的题解:
【算法小课堂】差分数组
一维差分的思想可以推广至二维
在这里插入图片描述
前置知识:二维前缀和
【图解】二维前缀和

思路:

由于邮票可以互相重叠,贪心地想,能放邮票就放邮票。
遍历所有能放邮票的位置去放邮票。注意邮票不能覆盖被占据的格子,也不能出界。
放邮票的同时,记录每个空格子被多少张邮票覆盖。如果存在一个空格子没被邮票覆盖,则返回 false,否则返回 true。
细节
怎么快速判断一个矩形区域可以放邮票?求出 grid 的二维前缀和,从而 O(1) 地求出任意矩形区域的元素和。如果一个矩形区域的元素和等于 0,就表示该矩形区域的所有格子都是 0。
假设用一个二维计数矩阵 cnt记录每个空格子被多少张邮票覆盖,那么放邮票时,就需要把 cnt的一个矩形区域都加一。怎么快速实现?可以用二维差分矩阵 d来代替 cnt。矩形区域都加一的操作,转变成 O(1)地对 d中四个位置的更新操作。
最后从二维差分矩阵 ddd 还原出二维计数矩阵 cnt。类似对一维差分数组求前缀和得到原数组,我们需要对二维差分矩阵求二维前缀和。遍历 cnt,如果存在一个空格子的计数值为 0,就表明该空格子没有被邮票覆盖,返回 false,否则返回 true。代码实现时,可以直接在 d数组上原地计算出 cnt。

来源:灵茶山艾府

class Solution {
public:
    bool possibleToStamp(vector<vector<int>> &grid, int stampHeight, int stampWidth) {
        int m = grid.size(), n = grid[0].size();

        // 1. 计算 grid 的二维前缀和
        vector<vector<int>> s(m + 1, vector<int>(n + 1));
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + grid[i][j];
            }
        }

        // 2. 计算二维差分
        // 为方便第 3 步的计算,在 d 数组的最上面和最左边各加了一行(列),所以下标要 +1
        vector<vector<int>> d(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 (s[i2][j2] - s[i2][j1 - 1] - s[i1 - 1][j2] + s[i1 - 1][j1 - 1] == 0) {
                    d[i1][j1]++;
                    d[i1][j2 + 1]--;
                    d[i2 + 1][j1]--;
                    d[i2 + 1][j2 + 1]++;
                }
            }
        }

        // 3. 还原二维差分矩阵对应的计数矩阵(原地计算)
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                d[i + 1][j + 1] += d[i + 1][j] + d[i][j + 1] - d[i][j];
                if (grid[i][j] == 0 && d[i + 1][j + 1] == 0) {
                    return false;
                }
            }
        }
        return true;
    }
};

灵神的大致思路如下:

  1. 计算二维前缀和:

    • 通过二维前缀和矩阵 s,计算每个位置的元素和,用于快速求取任意矩形区域的元素和。通过遍历二维矩阵 grid 实现。
  2. 计算二维差分:

    • 通过二维差分矩阵 d,记录每个空格子被邮票覆盖的次数。在这个阶段,通过遍历所有可能放置邮票的位置,判断该位置是否能够放置邮票(即该矩形区域内元素和为零),如果可以,就对差分矩阵 d 进行相应的更新。
  3. 还原二维差分矩阵对应的计数矩阵:

    • 对二维差分矩阵 d 进行还原,计算出每个空格子被多少张邮票覆盖。原地计算。
  4. 检查是否有未被覆盖的空格子:

    • 最后,遍历原始矩阵 grid,对于每个空格子,如果它是空的(值为 0),并且在计数矩阵中对应位置的计数为零,说明该空格子没有被邮票覆盖,返回 false。如果所有的空格子都被覆盖,返回 true

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

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

相关文章

番茄病虫害检测系统:融合感受野注意力卷积(RFAConv)改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 番茄是全球重要的蔬菜作物之一&#xff0c;具有广泛的经济和营养价值。然而&#xff0c;番茄病虫害的严重威胁导致了产量和质量的损失。因此&#xff0c;开发一种…

用23种设计模式打造一个cocos creator的游戏框架----(九)访问者模式

1、模式标准 模式名称&#xff1a;访问者模式 模式分类&#xff1a;行为型 模式意图&#xff1a;将数据操作与数据结构分离&#xff0c;使得在不修改数据结构的前提下&#xff0c;可以添加或改变对数据的操作。 结构图&#xff1a; 适用于&#xff1a; 当你需要对一个复杂对…

遇到运维故障,有没有排查和解决故障的正确流程?

稳定是偶然&#xff0c;异常才是常态&#xff0c;用来标注IT运维工作再适合不过。 因为对于IT运维来说&#xff0c;工作最常遇到的就是不稳定性带来的各种故障&#xff0c;经常围绕发现故障、响应故障、定位故障、恢复故障这四大步。 故障处理是最心跳的事情&#xff0c;没有…

OpenCV-Python15:图像阈值处理

目录 目标 图像阈值及分割算法介绍 简单阈值算法 自适应阈值算法 Otsus 二值化算法 Otsus 二值化原理 目标 通过本文你将学到图像二值化、简单阈值处理、自适应阈值、Otsus 二值化等。将学习的函数有cv2.threshold,cv2.adaptiveThreshold 等。 图像阈值及分割算法介…

GZ029 智能电子产品设计与开发赛题第9套

2023年全国职业院校技能大赛高职组 “GZ029智能电子产品设计与开发”赛项赛卷九 题目&#xff1a;模拟工业传送带物品检测系统的设计与开发 1 竞赛任务 在智能电视机上播放工业传送带传输物品视频&#xff0c;模拟工业传送带物品检测系统&#xff08;以下简称物品检测系统&…

训练效率提升40倍!开源图片生3D模型,Stable Zero123来啦

12月14日&#xff0c;著名生成式AI开源平台Stability.ai在官网开源了&#xff0c;图片生成高质量3D模型——Stable Zero123。 Stable Zero123是基于今年3月&#xff0c;丰田研究院和哥伦比亚大学联合开源的Zero123模型开发而成。主要通过更改渲染数据集和分数蒸馏对模型进行了…

leetcode -- 209 长度最小的子数组[滑动窗口/c++]

原题链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 滑动窗口其实就是同向双指针&#xff0c;因为计算结果的单调性&#xff0c;在符合条件的情况下&#xff0c;左右指针不必往回回溯&#xff0c;而实现优化的效果。 滑…

分布式数据库-课程总结

文章目录 参考资源HBase列族数据库简介与关系数据库的对比存储对比操作语句表级别语句表数据语句 数据库的原理存储结构架构 MongoDB文档数据库简介与关系数据库的对比存储对比操作语句 见PPT 命名规范数据库的原理 Redis键值内存数据库Neo4j图数据库 参考资源 http://172.16.…

佛山数字孪生赋能工业智能制造,助力制造业企业数字化转型

佛山数字孪生赋能工业智能制造&#xff0c;助力制造业企业数字化转型。数字孪生驱动的仿真服务可以模拟产品的各种真实功能&#xff0c;为不同的用户切换不同的应用场景。产品介绍、咨询和体验服务都可以通过产品数字孪生来完成。产品数字孪生在交易时可以交付给客户。产品销售…

HTTP协议请求详解

✏️✏️✏️今天给大家分享的是 HTTP 请求部分的基础知识。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈️✈️动动你们发财的小…

大数据与人工智能——神经网络是如何工作的?

大数据与人工智能——神经网络是如何工作的&#xff1f; 我们习惯于去了解所使用工具、中间件的底层原理&#xff0c;本文则旨在帮助大家了解AI模型的底层机制&#xff0c;让大家在学习或应用各种大模型时更加得心应手&#xff0c;更加适合没有AI基础的小伙伴们。 一、GPT与神…

【改进YOLOv8】车辆测距预警系统:融合空间和通道重建卷积SCConv改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着交通工具的普及和道路交通的不断增加&#xff0c;车辆安全问题日益凸显。特别是在高速公路等高速道路上&#xff0c;车辆之间的距离和速度差异较…

可数集合(可列集合、可列无限集)

凡是和全体正整数所构成的集合对等的集合都称为可数集合、或者叫可列集合、可列无限集。 由于可以按大小顺序排成一个无穷序列&#xff0c;因此一个集合A是可数集合的充要条件为&#xff1a;A可以排成一个无穷序列 可数集合是无限集合。

服务器常用命令介绍和负载监控的工具插件推荐

先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;❤️ ❤️ ❤️ 码字不易&#xff0c;如果喜欢可以关注我哦&#xff01; 如果本篇文章对你有所启发&#xff0c;欢迎访问我的个人博客 命令 服务器相关 5个常用命令 top Top命令不仅显示了当前内核服务的…

解决固定资产盘点问题,易点易动来帮忙!

固定资产盘点是企业管理中不可或缺的环节&#xff0c;然而&#xff0c;很多企业在固定资产盘点方面面临一系列问题&#xff1a; 盘点过程繁琐&#xff1a;传统的手动盘点方式需要耗费大量人力和时间&#xff0c;容易出现疏漏和错误&#xff0c;效率低下&#xff1b; 数据记录不…

2022最新云存储网盘系统,文件分享系统与文件存储系统。

资源入口 2022 最新云存储网盘系统, 文件分享系统与文件存储系统。 测试环境&#xff1a;Apache MySQL5.6 PHP7.0 安装 PHP 扩展 exif、fileinfo 从 PHP 禁用函数中 删除 shell_exec、proc_open、putenv 这三个 PHP 函数 PS&#xff1a;整体还不错的系统&#xff0c;注意的…

年薪30w+”,程序员涨薪秘诀竟然是它!

“程序员能纯靠技术渡过中年危机吗&#xff1f;” 知乎上的这个提问&#xff0c;吸引了大批码农留言&#xff0c;热赞均表示“能&#xff0c;很难”。因为难逃这两种结局&#xff1a; • 没精力学习&#xff0c;技术一迭代&#xff0c;被淘汰。 • 有技术&#xff0c;90%公…

爱名网被评为“最佳安全保障注册服务机构”

12月12日&#xff0c;由中国互联网络信息中心主办&#xff0c;中国科学院计算机网络信息中心、中国工业互联网研究院、中国互联网协会联合主办&#xff0c;人民邮电报社承办的第四届中国互联网基础资源大会&#xff08;CNIRC&#xff09;在北京举办。 在本届大会上&#xff0c…

官宣 鸿雁成为2023汇丰世界羽联世界巡回赛总决赛官方供应商

全屋智能和羽毛球运动能擦出怎样的火花&#xff1f; 鸿雁给你答案&#xff01; 12月13日&#xff0c;2023汇丰世界羽联世界巡回赛总决赛将在杭州举行。 鸿雁签约成为2023汇丰世界羽联世界巡回赛总决赛官方供应商&#xff0c;将携手世界羽联&#xff0c;为广大羽毛球爱好者们…

虹科技术 | IO-Link Wireless如何赋能工厂车间迈向无线自动化?

大规模定制、卓越运营和商业智能正在从根本上改变制造业&#xff0c;为了在竞争中立于不败之地&#xff0c;制造商需要更加灵活、通用、可扩展和具有成本效益的机器和生产线。随着制造商向工业 4.0 迈进&#xff0c;更好的适应性、更高的吞吐量和更短的停机时间是他们的共同要求…