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

news2024/9/24 17:09:58

文章目录

  • 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.coloradmin.cn/o/1310876.html

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

相关文章

飞轮储能一次调频并网三机九节点系统,虚拟惯性和下垂控制,也可加入虚拟同步机VSG控制,飞轮储能容量可调,系统频率50Hz,离散模型

5MW飞轮储能一次调频并网三机九节点系统&#xff0c;虚拟惯性和下垂控制&#xff0c;也可加入虚拟同步机VSG控制&#xff0c;飞轮储能容量可调&#xff0c;系统频率50Hz&#xff0c;离散模型&#xff0c;仿真运行速度快。 飞轮储能变流器采用双PWM环设计&#xff0c;并网电压电…

CleanMyMac2024绿色免费激活码序列号

2024CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具&#xff0c;电脑刚装完系统的时候运行速度超级快&#xff0c;随着时间的推移&#xff0c;你会发现越来越慢&#xff0c;经常会反应卡顿&#xff0c;越来越多的垃圾文件占用了你的磁盘空间&#xff0c;各种过时的日志…

数据结构学习 12字母迷宫

dfs 回溯 剪枝 这个题和dfs有关&#xff0c;但是我之前没有接触过&#xff0c;我看了这一篇很好的文章&#xff0c;看完之后写的答案。 我觉得很好的总结&#xff1a; dfs模板 int check(参数) {if(满足条件)return 1;return 0; }void dfs(int step) {判断边界{相应操作}尝试…

HPV为什么无症状?皮肤性病科专家谭巍解读具体原因

HPV&#xff0c;即人乳头瘤病毒&#xff0c;是一种常见的性传播疾病。然而&#xff0c;并不是所有感染HPV的人都会出现症状。为什么有的人感染HPV没有症状呢? 首先&#xff0c;需要了解的是&#xff0c;HPV感染是一种非常常见的现象。事实上&#xff0c;大约有80%的性活跃人群…

SLAM学习——相机模型(针孔+鱼眼)

针孔相机模型 针孔相机模型是很常用&#xff0c;而且有效的模型&#xff0c;它描述了一束光线通过针孔之后&#xff0c;在针孔背面投影成像的关系&#xff0c;基于针孔的投影过程可以通过针孔和畸变两个模型来描述。 模型中有四个坐标系&#xff0c;分别为world&#xff0c;c…

智能指针管理“newed对象”

为什么要有智能指针&#xff1f; 指针智能是管理管理动态内存分配对象的一种机制。它提供了自动管理内存&#xff0c;避免常见内存泄漏和悬空指针。 对于上述Func函数的操作&#xff0c;一不小心就会产生很多问题。 p1 new时候抛异常 什么都不做p2 new时候抛异常 p1需要被清理…

SpringBoot 接口实现幂等性,实现的四种方案!

什么是接口幂等性 在HTTP/1.1中&#xff0c;对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果&#xff08;网络超时等问题除外&#xff09;&#xff0c;即第一次请求的时候对资源产生了副作用&#xff0c;但是以后的多次请求都不会再对资…

3-分布式存储之Ceph

任务背景 虽然使用了分布式的glusterfs存储, 但是对于爆炸式的数据增长仍然感觉力不从心。对于大数据与云计算等技术的成熟, 存储也需要跟上步伐. 所以这次我们选用对象存储. 任务要求 1, 搭建ceph集群 2, 实现对象存储的应用 任务拆解 1, 了解ceph 2, 搭建ceph集群 3, 了…

【docker】 docker部署minio对象存储并用rclone同步

docker部署minio对象存储并用rclone同步 1.什么是minio&#xff1f; minio是一个开源的对象存储服务器&#xff0c;兼容S3协议。 官网&#xff1a;https://min.io/ 官方在开源的基础上也提供云端S3服务&#xff0c;分为个人和企业&#xff0c;有不同的收费标准。 1.1 自建对…

SQL注入【sqli靶场第15-19关】(四)

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 接上文&#xff1a;SQL注入【sqli靶场第11-14关】(三) …

Liunx系统安装mysql数据库

一、环境检查 1、检查本地是否安装MySQL服务&#xff1b; 2、下载MySQL安装包&#xff1b; 3、查看下载的文件 4、解压MySQL文件 5、安装MySQL 6、检查MySQL数据库安装情况 7、启动MySQL 8、查看MySQL安装初始密码 9、登录MySQL 10、设置远程授权 11、关闭防火墙

智慧灯杆技术应用分析

智慧灯杆是指在传统灯杆的基础上&#xff0c;通过集成多种先进技术实现城市智能化管理的灯杆。智慧灯杆技术应用的分析如下&#xff1a; 照明功能&#xff1a;智慧灯杆可以实现智能调光、时段控制等功能&#xff0c;根据不同的需求自动调节照明亮度&#xff0c;提高照明效果&am…

Pytorch学习概述

目录 学习目标人工智能1. 智能&#xff08;Intelligence&#xff09;1.1 人类智能1.2 机器学习&#xff08;人工智能&#xff09;1.3 深度学习1.4 学习系统的发展历程传统的机器学习策略 2. 传统机器学习算法的一些挑战3. 神经网络的简要历史3.1 Back Propagation&#xff08;反…

Java数据类型相关

数据类型 Java有哪些数据类型 定义&#xff1a;Java语言是强类型语言&#xff0c;对于每一种数据都定义了明确的具体的数据类 型&#xff0c;在内存中分配了不同大小的内存空间。 分类&#xff1a; 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,dou…

一键提取微信聊天记录,生成HTML、Word文档永久保存,还能生成微信年度聊天报告

不知道生活中你有没有遇到过这种情况&#xff0c;聊天记录不完整&#xff0c;有的在手机上&#xff0c;有的在电脑上&#xff0c;搜索起来很烦。那有没有一种办法可以把微信聊天记录统一呢&#xff1f;当然是有的。下面&#xff0c;就让我们一起来看一下怎么操作。 先看效果 操…

win11怎么录屏? Windows 11中录制屏幕的多种方法

Windows G 键在 Windows 11 中录制屏幕 win11怎么录屏&#xff1f;win11系统中想要对屏幕进行录屏&#xff0c;该怎么录屏呢&#xff1f;我们可以使用多款软件来实现&#xff0c;win11自带的软件和第三方软件&#xff0c;下面我们就来看看Windows 11中录制屏幕的多种方法 Win…

ICV:2023 年上半年全球量子计算的进展

2023年上半年&#xff0c;量子计算&#xff08;QC&#xff09;领域取得了一系列重要进展和突破&#xff0c;显示出量子计算技术的快速发展和商业应用的不断拓展。本报告从制度进步、产业生态、投融资形势、总结与展望四个方面对量子计算领域进行了系统而详细的分析。报告不仅回…

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

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

12.11图的存储方式(邻接矩阵、邻接表),对应操作(插入,删除,查找),遍历,最小生成树

构建树 先序输入 邻接输入 图的邻接矩阵 无向图 有向图 邻接矩阵就是通过顶点数组&#xff0c;直接记录顶点来记录边&#xff0c;即两个顶点数组夹成的二维数组里记录的就是边的信息 #define MaxVertexNum 100 //顶点数目的最大值 typedef char VertexType; //顶点的数据类…

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;并清空选择…