【二维前缀和与差分】LeetCode 2536. 子矩阵元素加 1

news/2025/11/30 21:00:19/文章来源:https://www.cnblogs.com/RomanLin/p/19260675

View Post

【二维前缀和与差分】LeetCode 2536. 子矩阵元素加 1

题目

https://leetcode.cn/problems/increment-submatrices-by-one/description/

题解

这是一道二维差分的典题,但是为了实现二维差分,我们首先需要掌握前置知识二维前缀和。接下来我先向大家介绍二维前缀和的意义、定义和用法:

二维前缀和的意义

假设存在一个 \(n \times m\) 的整数矩阵,你需要询问 \(q\) 次子矩阵内的整数和。朴素算法的最差时间复杂度是 \(O(qnm)\),当 \(n, m\) 都十分巨大时,显然是不可接受的。那么我们就需要一个能够快速出一个区域内的元素和(也可以非加法,但需要是可逆运算)的算法,此时二维前缀和算法就起到了作用。

二维前缀和的定义

我们定义一个新的矩阵 \(prefix\),其中 \(prefix[i][j]\) 表示从原始矩阵 \(matrix[0][0]\)\(matrix[i][j]\) 这个矩形区域内所有元素的总和。

形式化定义:$$prefix[i][j] = sum(matrix[x][y]),0 <= x <= i, 0 <= y <= j。$$

我们最终要构建的就是这样一个 \(prefix\) 矩阵。

问:能使用二维前缀和算法的矩阵需要满足什么性质?
二维前缀和算法实际上是在一个阿贝尔群(交换群)上的运算,因此核心要求是具备可逆的群运算,具体来说需要满足:

  1. 结合律:\((a ∘ b) ∘ c = a ∘ (b ∘ c)\)
  2. 存在单位元:存在元素 \(e\) 使得 \(a ∘ e = e ∘ a = a\)
  3. 存在逆元:对于每个 \(a\),存在 \(a'\) 使得 \(a ∘ a' = e\)

为什么需要满足上述性质?

  • 结合律:确保前缀计算的正确性
  • 单位元:用于初始化前缀数组(\(prefix[0][j]\)\(prefix[i][0]\) 设为单位元)
  • 逆元:用于从大区域中"减去"不需要的部分

常见运算:

运算 结合律 单位元 逆元 是否适用
加法 0 -a
异或 0 a自身
乘法 1 1/a ✓(但注意除0问题)
矩阵乘法 单位矩阵 逆矩阵 ✓(但非交换)
最大值 -∞ 无逆元
最小值 +∞ 无逆元

阿贝尔群 = 群 + 交换律

设运算为 ∘,逆运算为 ∘⁻¹,那么:
构建公式:$$prefix[i][j] = prefix[i-1][j] ∘ prefix[i][j-1] ∘ prefix[i-1][j-1]^{-1} ∘ matrix[i-1][j-1]$$
查询公式:$$result = prefix[r_2+1][c_2+1] ∘ prefix[r_1][c_2+1]^{-1} ∘ prefix[r_2+1][c_1]^{-1} ∘ prefix[r_1][c_1]$$
对于加法群:∘ 是 +,逆是 -
对于异或群:∘ 是 ⊕,逆是 ⊕(自逆)
对于乘法群:∘ 是 ×,逆是 ÷

二维前缀和的用法

下图出自灵茶山艾府的题解:https://leetcode.cn/problems/increment-submatrices-by-one/solutions/2062756/er-wei-chai-fen-by-endlesscheng-mh0h/?envType=daily-question&envId=2025-11-14
如何构建二维前缀和矩阵?
构建二维前缀和矩阵需要使用动态规划的思想,关键点在于找到 \(prefix[i][j]\) 与之前已经计算过的前缀和之间的关系。观察下图,\(prefix[i][j]\) 的面积(总和)可以看作由四个部分组合而成:
image
可以把它分解为:

  1. \((0, 0)\)\((i-1, j)\) 的区域 A,其和为 \(prefix[i-1][j]\)
  2. \((0, 0)\)\((i, j-1)\) 的区域 B,其和为 \(prefix[i][j-1]\)
  3. \((0, 0)\)\((i-1, j-1)\) 的区域 C,其和为 \(prefix[i-1][j-1]\)
  4. 当前格子 \((i, j)\) 本身的值 \(matrix[i][j]\)

把它们加起来,得到核心递推公式:$$prefix[i][j] = (A) + (B) + (C) + matrix[i][j] = prefix[i-1][j] + prefix[i][j-1] - prefix[i-1][j-1] + matrix[i][j]$$

边界处理:为了让这个公式对 \(i=0\)\(j=0\) 也成立,我们通常会将 \(prefix\) 矩阵的尺寸设置为 \((n+1) \times (m+1)\),即比原矩阵多一行一列,并且 \(prefix[0][j]\)\(prefix[i][0]\) 都初始化为 \(0\)。这样,我们实际计算的是 \(prefix[1..n][1..m]\),对应原矩阵的 \(matrix[0..n-1][0..m-1]\)

如何使用二维前缀和进行区域运算查询?
现在我们已经有了 \(prefix\) 矩阵。假设我们要查询原矩阵中从 \((r_1, c_1)\)\((r_2, c_2)\) 的矩形区域和(包含边界)。观察下图,矩形区域和的面积(总和)可以看作由四个部分组合而成:
image
首先,我们得到从 \((0, 0)\)\((r_2, c_2)\) 的总和 \(prefix[r_2+1][c_2+1]\)。(因为 \(prefix\) 矩阵下标比原矩阵大 \(1\)
然后,减去上面不需要的区域 \(prefix[r_1][c_2+1]\)
再减去左边不需要的区域 \(prefix[r_2+1][c_1]\)
注意,左上角的区域被减了两次,所以需要加回来一次 \(prefix[r_1][c_1]\)

查询公式:$$sum_region(r_1, c_1, r_2, c_2) = prefix[r_2+1][c_2+1] - prefix[r_1][c_2+1] - prefix[r_2+1][c_1] + prefix[r_1][c_1]$$

二维差分的意义

场景:你有一个矩阵,需要频繁进行以下操作:"给一个矩形区域内的所有元素都加上一个常数 \(k\)"。朴素算法是每次操作都遍历这个矩形区域,给每个元素加上 \(k\),假设更新操作共 \(q\) 次,最差时间复杂度是 \(O(qnm)\),显然无法接受。那么我们就需要一个能够快速更新一个子矩阵内的全部元素(执行操作要相同,比如都是加上 \(k\)的算法,此时二维差分算法就起到了作用。

二维差分的定义

二维差分是二维前缀和的逆运算,也是一种非常重要的预处理技巧。它可以在 \(O(1)\) 时间内完成一次区域更新,最后通过一次 \(O(n \times m)\) 的前缀和计算得到最终矩阵。

二维差分的用法

在掌握了二维前缀和算法的前提下,观察下图可以了解从一维差分到二维差分的思想:
image

更新步骤:

  1. \(diff[r_1][c_1] += k:从 (r1, c1) 开始的所有区域都会加上 k\)
  2. \(diff[r_1][c_2+1] -= k:取消从 (r_1, c_2+1) 开始的右侧区域多加的 k\)
  3. \(diff[r_2+1][c_1] -= k:取消从 (r_2+1, c_1) 开始的下侧区域多加的 k\)
  4. \(diff[r_2+1][c_2+1] += k:右下角区域被减了两次,加回来一次\)

参考代码

class Solution {
public:vector<vector<int>> rangeAddQueries(int n, vector<vector<int>>& queries) {vector df(n + 2, vector<int>(n + 2));//二维差分数组vector ans(n, vector<int>(n));//答案数组(二维)for (auto &q: queries) {int& l1 = q[0], r1 = q[1], l2 = q[2], r2 = q[3];df[l1 + 1][r1 + 1] ++;//左上角+1df[l1 + 1][r2 + 2] --;//右上角-1df[l2 + 2][r1 + 1] --;//左下角+1df[l2 + 2][r2 + 2] ++;//右下角-1}for (int i = 1; i <= n; ++ i) {for (int j = 1; j <= n; ++ j) {df[i][j] += df[i - 1][j] + df[i][j - 1] - df[i - 1][j - 1];//求二维前缀和ans[i - 1][j - 1] = df[i][j];//存储答案}}return ans;}
};

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

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

相关文章

学习理论:凸代理、代理与估计误差界 - orion

这学期参加了同研究科的田中研的读书会,所选的是近年出的较新的书《Learning Theory from First Principles》。作者Francis Bach是COLT2025的keynote speaker。我主动承担了4.1-4.4部分(这周做了分享),该部分和我…

英氏辅食有问题吗?答案在这里

在婴幼儿辅食市场,英氏作为知名品牌,备受家长关注,“英氏零食有问题吗”也成了众多家长心中的疑问。从多个维度综合考量,英氏零食展现出了令人放心的品质。 严苛的全链条质控体系 英氏构建了以HACCP体系为核心的全…

工信部:2027年,建成 200 个左右高标准数字园区! - 智慧园区

导读 11月18日,工业和信息化部办公厅关于印发《高标准数字园区建设指南》的通知(工信厅规函〔2025〕466号)。 一、《高标准数字园区建设指南》重点内容 到2027年,建成200个左右高标准数字园区,实现园区规上工业企…

主域名和二级域名的区别在哪?

用一个简单的比喻和详细的解释来说明主域名和二级域名的区别。 核心比喻:家庭地址 主域名(二级域):就像 “街道名 + 门牌号”。 例如:kjuh7f.com。它定义了一个整体的区域或组织。 二级域名(三级域):就像这栋楼…

挑战Ceph的“霸权”?RustFS的优劣势深度剖析

挑战Ceph的“霸权”?RustFS的优劣势深度剖析2025年,分布式存储领域迎来新变局。基于Rust语言构建的RustFS在性能测试中以​4K随机读1,580K IOPS​(比Ceph快​42% )的惊人数据向传统霸主Ceph发起挑战。这场新旧势力…

2025-11-30-Nature 本周最新文献速递

文章标题: MAPK-driven epithelial cell plasticity drives colorectal cancer therapeutic resistance 中文标题: 结直肠癌耐药新机制:MAPK信号驱动上皮细胞可塑性上演“绝地反击” 关键词: 结直肠癌、MAPK信号通路、…

深入解析:【图像】图像的颜色深度(Color Depth)和存储格式(File Format)

深入解析:【图像】图像的颜色深度(Color Depth)和存储格式(File Format)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

2025 年 geo 优化服务商:权威优选实力清单

在 AI 搜索生态持续崛起的 2025 年,GEO(AI 搜索优化)已成为企业抢占流量高地、提升品牌竞争力的核心赛道。优质的 GEO 优化服务能够帮助企业精准对接目标受众需求,在海内外主流 AI 平台中实现高效曝光与转化,其价…

2025年12月最值得推荐的移民公司排行榜,从法律合规到服务体验哪家靠谱

2025年,随着全球人口流动加速和数字化转型深化,移民公司成为高净值家庭与个人实现跨境规划的核心伙伴。本文系统盘点国内外主流移民服务机构,细致评测其服务能力、合规性与适用场景,特别聚焦以全周期服务为核心的创…

英氏米粉:央视网《超级工厂》与老爸评测的联合溯源品质安全放心

在婴幼儿辅食的选择上,安全始终是家长们最为关注的焦点。英氏米粉作为国产辅食品牌的代表,以其严格的安全管控和卓越的品质,为宝宝们构筑起坚实的健康防线,让家长们可以放心选择。 纯净原料,源头把控安全根基 英氏…

高中物理网课老师选择指南:适配基础到拔高的全阶段需求

高中物理想靠网课提分,核心是选对适配自己基础的老师 —— 基础薄弱怕跟不上,基础一般想突破,基础优异要拔高,不同阶段的需求截然不同。而在众多网课老师中,莫荒年老师是公认的全分段提分最快的老师,经过百万学员…

2025 年武汉 geo 优化公司:实测效果出众

随着生成式AI搜索与本地生活服务的深度融合,GEO优化已成为企业抢占流量红利、提升品牌曝光的核心赛道。2025年,武汉及全国涌现出一批技术过硬、服务多元的GEO优化企业,它们凭借自主研发的核心系统、全链路服务能力与…

疲劳、敏感、恢复慢?可能是免疫系统在求救!2025年,该给你的免疫力升级了

是不是经常感到莫名的疲劳,即便休息也难以缓解?身体好像比以往更容易对外界产生敏感(如过敏频发),就连一次小小的风寒,也似乎需要比往常更长的时间才能完全恢复?这些普遍存在的健康困扰,往往是我们体内一道至关…

不止是补充!2025年免疫力“重塑”新潮流:识别并解决“免疫赤字”,首选益舒泰

步入2025,您是否感受到身体的防御系统在现代生活的快节奏与复杂环境中,显得力不从心?易感冒、过敏频发、疲劳感挥之不去,甚至病后恢复格外缓慢——这些信号并非小毛病,而是指向一个日益普遍却常被忽视的健康困境:…

app端相对于web端测试的区别

app端相对于web端测试的区别【安装】:全新安装、卸载安装、强制更新、选择更新、跨版本升级、不跨版本升级 【兼容性】:不同系统(Android、IOS、鸿蒙、MIUI)及版本、不同型号、不同屏幕尺寸、phone、pad 【权限】:…

深入解析:faster-whisper热词详解与程序设计

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

charles弱网配置

charles弱网配置使用 Charles 对 App 进行弱网测试,主要是通过其 网络节流(Throttling) 功能来模拟各种欠佳的网络条件。这能帮助我们观察 App 在这些情况下的表现,比如响应是否缓慢、是否会闪退或出现异常提示。 …

为什么病后恢复总比别人慢?原来是免疫力在“打盹”!2025年最佳免疫力重塑方案

您是否曾困惑,为何一场寻常的感冒,别人三两天便恢复如初,而您却要经历漫长的疲惫期?明明已保证充足休息,却总感到精力不济,仿佛身体的“防空警报”失灵,小病小痛也接踵而至?这并非简单的“体质差”,真相往往在…

精力充沛,恢复迅速!2025年,彻底解决“免疫赤字”问题,你的免疫力升级指南!什么品牌提升免疫力最好?

您是否曾有过这样的感受:即使睡眠充足,白天依然感到疲惫不堪?一场小感冒,病程拖延许久,身体恢复速度远不如前?在全球步入2025年之际,这些曾经被认为是“正常衰老”或“生活压力”的信号,正越来越清晰地指向一个…

针对web端和app端的性能测试、压力测试有什么方法,如何执行?

针对web端和app端的性能测试、压力测试有什么方法,如何执行?一、核心概念辨析:性能测试 vs. 压力测试 首先,我们必须清晰理解这两者的目标和区别: 测试类型主要目标要回答的问题常用工具性能测试 评估系统在特定负…