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

 🔥博客主页: A_SHOWY
🎥系列专栏:力扣刷题总结录 数据结构  云计算  数字图像处理  力扣每日一题_

2132. 用邮票贴满网格图icon-default.png?t=N7T8https://leetcode.cn/problems/stamping-the-grid/

 

今天的每日一题又是一道恶心的困难题目,花了四个小时才完全理解所谓的二维前缀和二维差分的方法来解决这道题。

在这个算法中,我们需要解决两个问题:

1.贴邮票时,如何快速判断右下角固定范围内不存在被占据的格子,而都是空格子呢?
2.最后做检查时,如何快速判断每个空格子都被邮票覆盖呢?

第一步:定义两个二维数组

 int m = grid.size();
        int n = grid[0].size();
       //定义两个数组
       vector<vector<int>> sum(m + 2, vector<int>(n + 2,0));
       vector<vector<int>> diff(m + 2, vector<int>(n + 2,0));//两个数组左右都超出去2为了简化边界情况

 定义一个二维向量 sum,用于存储网格元素的前缀和。这里使用 m + 2n + 2 来构建比原始网格大一圈的二维向量,目的是为了简化边界条件的处理。

第二步: 将前缀和导入sum数组 

 //将前缀和导入sum数组
     for(int i = 1; i <= m; i++){
         for(int j =1; j <= n; j++){
             sum[i][j] = sum[i][j-1] + sum[i-1][j] -sum[i-1][j-1] + grid[i-1][j-1]; 
         }
     } 

第三步:检查在网络中可能的印章位置(从[i][j]到[x][y])

for(int i = 1; i + stampHeight -1 <= m; i++){
           for(int j =1; j +stampWidth -1 <=n; j++){
               int x = i + stampHeight -1;
               int y = j + stampWidth -1;
               if(sum[x][y] - sum[x][j-1] -sum[i-1][y] + sum[i-1][j-1] ==0) {
                   diff[x+1][y+1]++;
                   diff[i][y+1]--;
                   diff[x+1][j]--;
                   diff[i][j]++;
               }
           }
       }

检查在网格中的可能印章位置。通过遍历网格,在满足印章大小的条件下,检查印章能否覆盖整个区域。如果印章可以覆盖,则更新 diff 数组。这种标记更新的方法是基于差分数组(difference array)的思想。通过增加和减少标记来标识印章所覆盖的区域,以便后续检查未覆盖区域的情况。

第四步:检查diff数组的标记情况

for(int i = 1; i <= m; i++){
           for(int j=1; j <= n; j++){
               diff[i][j] += diff[i-1][j] + diff[i][j-1] -diff[i-1][j-1];
               if(diff[i][j] == 0 && grid[i-1][j-1] == 0){
                   return false;
               }
           }
       }
       return true;
    }

最后的循环用于检查 diff 数组中的标记情况。如果发现某个位置上的标记为0,并且对应的原始网格上也为0,说明有未覆盖的区域,返回 false;否则,返回 true 表示可以成功覆盖整个网格。 

这里值得注意的是

   if(diff[i][j] == 0 && grid[i-1][j-1] == 0)

  • 在代码中,涉及到 grid[i - 1][j - 1] 这样的索引操作。这样的索引操作中使用了 i - 1j - 1 的形式,是因为数组的索引通常是从0开始而不是从1开始。对于 diff 数组,它记录的是覆盖状态的变化情况,不同于 grid 数组记录的是原始网格中各个位置的值。在这个特定的算法中,diff 数组用于追踪覆盖状态的变化,因此在对其进行访问和更新时,通常不需要对索引进行 -1 的处理。

五、完整代码 

这道题目就最终完成了,完整代码为:

class Solution {
public:
    bool possibleToStamp(vector<vector<int>>& grid, int stampHeight, int stampWidth) {
        int m = grid.size();
        int n = grid[0].size();
       //定义两个数组
       vector<vector<int>> sum(m + 2, vector<int>(n + 2,0));
       vector<vector<int>> diff(m + 2, vector<int>(n + 2,0));//两个数组左右都超出去2为了简化边界情况
       //将前缀和导入sum数组
     for(int i = 1; i <= m; i++){
         for(int j =1; j <= n; j++){
             sum[i][j] = sum[i][j-1] + sum[i-1][j] -sum[i-1][j-1] + grid[i-1][j-1]; 
         }
     } 
       for(int i = 1; i + stampHeight -1 <= m; i++){
           for(int j =1; j +stampWidth -1 <=n; j++){
               int x = i + stampHeight -1;
               int y = j + stampWidth -1;
               if(sum[x][y] - sum[x][j-1] -sum[i-1][y] + sum[i-1][j-1] ==0) {
                   diff[x+1][y+1]++;
                   diff[i][y+1]--;
                   diff[x+1][j]--;
                   diff[i][j]++;
               }
           }
       }
       for(int i = 1; i <= m; i++){
           for(int j=1; j <= n; j++){
               diff[i][j] += diff[i-1][j] + diff[i][j-1] -diff[i-1][j-1];
               if(diff[i][j] == 0 && grid[i-1][j-1] == 0){
                   return false;
               }
           }
       }
       return true;
    }
};

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构期末复习】完善中

文章目录 二叉树的三种遍历方式怎么看遍历结果相关题目&#xff1a;已知一颗二叉树的后续遍历序列为&#xff1a;GFEDCBA;中序遍历序列为&#xff1a;FGAEBDC。画出这棵二叉树思路代码版 先序线索树二叉树转树、或森林树转二叉树二叉树转树二叉树转森林森林转二叉树 二叉树的三…

Java之BigDecimal详解

一、BigDecimal概述 Java在java.math包中提供的API类BigDecimal&#xff0c;用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数&#xff0c;但在实际应用中&#xff0c;可能需要对更大或者更小的数进行运算和处理。一般情况下&#xff0c;对…

阿里云人工智能平台PAI多篇论文入选EMNLP 2023

近期&#xff0c;阿里云人工智能平台PAI主导的多篇论文在EMNLP2023上入选。EMNLP是人工智能自然语言处理领域的顶级国际会议&#xff0c;聚焦于自然语言处理技术在各个应用场景的学术研究&#xff0c;尤其重视自然语言处理的实证研究。该会议曾推动了预训练语言模型、文本挖掘、…

【基于卷积神经网络的疲劳检测与预警系统的设计与实现】

基于卷积神经网络的疲劳检测与预警系统的设计与实现 引言数据集介绍技术与工具1. OpenCV2. TensorFlow3. 卷积神经网络&#xff08;CNN&#xff09; 系统功能模块1. 视频采集模块2. 图像预处理模块3. 人脸识别模块4. 疲劳程度判别模块5. 报警模块 系统设计创新点1. 实时监测与预…

js解析.shp文件

效果图 原理与源码 本文采用的是shapefile.js工具 这里是他的npm地址 https://www.npmjs.com/package/shapefile 这是他的unpkg地址&#xff0c;可以点开查看源码 https://unpkg.com/shapefile0.6.6/dist/shapefile.js 这个最关键的核心问题是如何用这个工具&#xff0c;网上…

如何正确使用缓存来提升系统性能

文章目录 引言什么时候适合加缓存&#xff1f;示例1示例2&#xff1a;示例3&#xff1a; 缓存应该怎么配置&#xff1f;数据分布**缓存容量大小&#xff1a;**数据淘汰策略 缓存的副作用总结 引言 在上一篇文章IO密集型服务提升性能的三种方法中&#xff0c;我们提到了三种优化…

如何在iPad Pro上实现SSH远程连接服务器并进行云端编程开发【内网穿透】

文章目录 前言1. 在iPad下载Code APP2.安装cpolar内网穿透2.1 cpolar 安装2.2 创建TCP隧道 3. iPad远程vscode4. 配置固定TCP端口地址4.1 保留固定TCP地址4.2 配置固定的TCP端口地址4.3 使用固定TCP地址远程vscode 前言 本文主要介绍开源iPad应用IDE如何下载安装&#xff0c;并…

京微齐力:基于H7的平衡控制系统(一、姿态解析)

目录 前言一、关于平衡控制系统二、实验效果三、硬件选择1、H7P20N0L176-M2H12、MPU6050 四、理论简述五、程序设计1、Cordic算法2、MPU6050采集数据3、fir&iir滤波4、姿态解算 六、资源消耗&工程获取七、总结 前言 很久之前&#xff0c;就想用纯FPGA做一套控制系统。可…

9.2 Linux LED 驱动开发

一、Linux 下的 LED 驱动原理 Linux 下的任何驱动&#xff0c;最后都是要配置相应的硬件寄存器。 1. 地址映射 MMU 全称叫做 MemoryManage Unit&#xff0c;也就是内存管理单元。 现在的 Linux 支持无 MMU 处理器。MMU 主要完成的功能为&#xff1a; 1、完成虚拟空间到物理空间…

香港科技大学数据建模(MSc DDM)硕士学位项目(2024年秋季入学)招生宣讲会-四川大学专场

时间&#xff1a;2023 年 12 月 26 日&#xff08;周二&#xff09; 14:30 地点&#xff1a;四川大学望江校区基础教学楼 C 座 102 嘉宾教授&#xff1a;潘鼎 教授 项目旨在培养科学或工程背景的学员从数据中提取信息的数据建模能力&#xff0c;训练其拥有优秀的解难和逻辑思…

旅游景区文旅地产如何通过数字人开启数字营销?

随着元宇宙的发展&#xff0c;为虚实相生的营销带来更多的可能性。基于虚拟世界对于现实世界的模仿&#xff0c;通过构建沉浸式数字体验&#xff0c;增强现实生活的数字体验&#xff0c;强调实现真实体验的数字化&#xff0c;让品牌结合数字人开启数字化营销。 *图片源于网络 …

谷歌浏览器怎么关闭自动更新?

文章目录 一、方式一 谷歌浏览器安装完成后&#xff0c;每天都会自动更新到最新的版本&#xff0c;但是对于有些程序的驱动&#xff0c;浏览器一更新就不能自动启动浏览器&#xff0c;会给我们带来很多困扰。下面我们介绍怎么将谷歌浏览器自动更新关闭&#xff0c;如果需要更新…

# 和 $ 的区别②

上节博客说了使用 # 的时候,如果参数为 String ,会自动加上单引号 但是当参数为String 类型的时候,也有不需要加单引号的情况,这时候用 # 那就会出问题 比如根据 升序(asc) 或者 降序(desc) 查找的时候,加了单引号那就会报错 这个时候我们就只能使用 $ 如果看不懂代码,就去…

Android Studio实现俄罗斯方块

文章目录 一、项目概述二、开发环境三、详细设计3.1 CacheUtils类3.2 BlockAdapter类3.3 CommonAdapter类3.4 SelectActivity3.5 MainActivity 四、运行演示五、项目总结 一、项目概述 俄罗斯方块是一种经典的电子游戏&#xff0c;最早由俄罗斯人Alexey Pajitnov在1984年创建。…

Rask AI引领革新,推出多扬声器口型同步技术,打造本地化内容新纪元

“ Rask AI是一个先进的AI驱动视频和音频本地化工具&#xff0c;旨在帮助内容创作者和公司快速、高效地将他们的视频转换成60多种语言。通过不断创新和改进产品功能&#xff0c;Rask AI正塑造着未来媒体产业的发展趋势。 ” 在多语种内容创作的新时代&#xff0c;Rask AI不断突…

spring 笔记六 SpringMVC 获得请求数据

文章目录 SpringMVC 获得请求数据获得请求参数获得基本类型参数获得POJO类型参数获得数组类型参数获得集合类型参数请求数据乱码问题参数绑定注解requestParam获得Restful风格的参数获得Restful风格的参数自定义类型转换器获得Servlet相关API获得请求头RequestHeaderCookieValu…

CMS—评论设计

一、需求分析 1.1、常见行为 1.敏感词过滤 2.新增评论&#xff08;作品下、评论下&#xff09; 3.删除评论&#xff08;作品作者、上级评论者、本级作者&#xff09; 4.上级评论删除关联下级评论 5.逻辑状态变更&#xff08;上线、下线、废弃...&#xff09; 6.上逻辑状态变更…

Mac部署Odoo环境-Odoo本地环境部署

Odoo本地环境部署 安装Python安装Homebrew安装依赖brew install libxmlsec1 Python运行环境Pycharm示例配置 Mac部署Odoo环境-Odoo本地环境部署 安装Python 新机&#xff0c;若系统没有预装Python&#xff0c;则安装需要版本的Python 点击查询Python官网下载 安装Homebrew 一…

solidity 特性导致的漏洞

目录 1、默认可见性 2、浮点数精度缺失 3、错误的构造函数 4、自毁函数 5、未初始化指针-状态变量覆盖 1、默认可见性 Solidity 的函数和状态变量有四种可见性&#xff1a;external、public、internal、private。函数可见性默认为 public&#xff0c;状态变量可见性默认为…

RS485转WiFi工业路由器在冷链物流温度监控中的应用

随着物联网技术的不断发展和应用&#xff0c;冷链物流行业也迎来了新的机遇和挑战。在冷链物流中&#xff0c;对温度监控的要求尤为重要&#xff0c;因为温度是保证货物质量和安全的关键因素之一。而RS485转WiFi工业路由器则成为了实现高效、可靠的温度监控系统的重要组成部分。…