当前位置: 首页 > news >正文

【数据结构-二维差分】力扣2536. 子矩阵元素加 1

给你一个正整数 n ,表示最初有一个 n x n 、下标从 0 开始的整数矩阵 mat ,矩阵中填满了 0 。

另给你一个二维整数数组 query 。针对每个查询 query[i] = [row1i, col1i, row2i, col2i] ,请你执行下述操作:

找出 左上角 为 (row1i, col1i) 且 右下角 为 (row2i, col2i) 的子矩阵,将子矩阵中的 每个元素 加 1 。也就是给所有满足 row1i <= x <= row2i 和 col1i <= y <= col2i 的 mat[x][y] 加 1 。
返回执行完所有操作后得到的矩阵 mat 。

示例 1:
在这里插入图片描述
输入:n = 3, queries = [[1,1,2,2],[0,0,1,1]]
输出:[[1,1,0],[1,2,1],[0,1,1]]
解释:上图所展示的分别是:初始矩阵、执行完第一个操作后的矩阵、执行完第二个操作后的矩阵。

  • 第一个操作:将左上角为 (1, 1) 且右下角为 (2, 2) 的子矩阵中的每个元素加 1 。
  • 第二个操作:将左上角为 (0, 0) 且右下角为 (1, 1) 的子矩阵中的每个元素加 1 。

示例 2:
在这里插入图片描述
输入:n = 2, queries = [[0,0,1,1]]
输出:[[1,1],[1,1]]
解释:上图所展示的分别是:初始矩阵、执行完第一个操作后的矩阵。

  • 第一个操作:将矩阵中的每个元素加 1 。

在这里插入图片描述

二维差分

class Solution {
public:vector<vector<int>> rangeAddQueries(int n, vector<vector<int>>& queries) {vector<vector<int>> diff(n+2, vector<int>(n+2));for(auto &query : queries){int r1 = query[0], c1 = query[1], r2 = query[2], c2 = query[3];diff[r1+1][c1+1]++;diff[r2+2][c1+1]--;diff[r1+1][c2+2]--;diff[r2+2][c2+2]++;}for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){diff[i][j] += diff[i-1][j] + diff[i][j-1] - diff[i-1][j-1];}}diff.erase(diff.begin());diff.erase(diff.end());for(auto& row : diff){row.erase(row.begin());row.erase(row.end());}return diff;}
};

在二维差分中,我们要先求出二维的差分矩阵,然后在将其进行前缀和相加得到我们所想要的矩阵。在构造差分矩阵中,我们构造了一个大小(n+2) * (n+2)的矩阵。

有人会想问,为什么在一维差分中,差分只需要多1的空间,而在二维差分的矩阵中,我们有diff[r2+2][c2+2]++;,实际上是因为,我们在后面需要运用到前缀和来累加差分矩阵,而前缀和需要我们第0行和第0列都为0,用来辅助计算,而差分又使最后一行和最后一列多出来用来辅助差分计算,所以最后就需要多出两行和两列的空间。

计算完差分数组后,就计算差分的前缀和,就构成了我们答案需要的矩阵。但是前缀和运算后,由于矩阵的外面一圈都是用来辅助计算的,所以都要去掉。去掉外面一圈后,剩下的矩阵就是我们所需要的矩阵。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Kafka-Go学习
  • 5.内容创作的未来:ChatGPT如何辅助写作(5/10)
  • 算法题之每日温度
  • Vue学习记录之三(ref全家桶)
  • 山东潍坊戴尔存储服务器维修 md3800f raid恢复
  • Spring:项目中的统一异常处理和自定义异常
  • MATLAB入门基础篇
  • 2024数学建模研赛华为杯选题建议详细思路代码文章A题B题C题D题E题F题研究生数模竞赛
  • 我的AI工具箱Tauri版-FasterWhisper音频转文本
  • 【毕业设计】基于 PHP 开发的社区交流系统
  • ubuntu 22.04 ~24.04 如何修改登录背景
  • golang学习笔记2-语法要求,注释与代码风格
  • 周边游小程序开发
  • 双击就可以打开vue项目,而不用npm run dev
  • Redis——redispluspls库通用命令以及String类型相关接口使用
  • JavaScript-如何实现克隆(clone)函数
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • Akka系列(七):Actor持久化之Akka persistence
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • IP路由与转发
  • PAT A1092
  • REST架构的思考
  • SOFAMosn配置模型
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue.js-Day01
  • VuePress 静态网站生成
  • 创建一种深思熟虑的文化
  • 电商搜索引擎的架构设计和性能优化
  • 基于Android乐音识别(2)
  • 力扣(LeetCode)357
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 人脸识别最新开发经验demo
  • 算法-图和图算法
  • 因为阿里,他们成了“杭漂”
  • 怎么把视频里的音乐提取出来
  • 找一份好的前端工作,起点很重要
  • zabbix3.2监控linux磁盘IO
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # SpringBoot 如何让指定的Bean先加载
  • # 数据结构
  • (Java)【深基9.例1】选举学生会
  • (k8s中)docker netty OOM问题记录
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二)原生js案例之数码时钟计时
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (已解决)什么是vue导航守卫
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)