前缀和&差分
一维差分
不支持边修边查,核心思想是最后统一修改。
需要注意,对\(L-R\)段处理时,最右端消除影响的纪录应该在差分数组的R+1位置进行记录,同时要注意处理\(R\)为最后位置时可能出现的越界情况。
例题
题目链接:1109. 航班预订统计 - 力扣(LeetCode)
实现代码:
点击展开代码
等差数列一维差分
已知数组arr,对其进行\(k\)次操作,每次操作选取左右两个端点,给定一个相同长度的等差数列[s,e,d]表示数列首尾和公差,一一对应加在选取的区间上,求多次操作后的结果。
本质上是两次一维差分,和一维差分相同,不支持边查边改;在每次操作的预处理中和一维差分有所区别,执行以下四步:
arr[l]+=sarr[l+1]+=d-sarr[r+1]-=d+earr[r+2]+=e
二维前缀和
二维前缀和的题目通常为给定一个矩阵matrix,求其中某个矩形区域的和。
思路为预处理时每个节点记录以[0,0]为左上角、该节点为右下角的矩阵的总和;对于每个元素[x,y],其值为matrix[x][y]+pre[x-1][y]+pre[x][y-1]-pre[x-1][y-1],需要额外注意边界的情况。
例题
前缀和
题目链接:304. 二维区域和检索 - 矩阵不可变 - 力扣(LeetCode)
点击展开题目
给定一个二维矩阵 matrix,以下类型的多个请求:
- 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为
(row1, col1),右下角 为(row2, col2)。
实现 NumMatrix 类:
NumMatrix(int[][] matrix)给定整数矩阵matrix进行初始化int sumRegion(int row1, int col1, int row2, int col2)返回 左上角(row1, col1)、右下角(row2, col2)所描述的子矩阵的元素 总和 。
示例 1:

输入:
["NumMatrix","sumRegion","sumRegion","sumRegion"]
[[[[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]]],[2,1,4,3],[1,1,2,2],[1,2,2,4]]
输出:
[null, 8, 11, 12]解释:
NumMatrix numMatrix = new NumMatrix([[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]]);
numMatrix.sumRegion(2, 1, 4, 3); // return 8 (红色矩形框的元素总和)
numMatrix.sumRegion(1, 1, 2, 2); // return 11 (绿色矩形框的元素总和)
numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)
提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 200-105 <= matrix[i][j] <= 1050 <= row1 <= row2 < m0 <= col1 <= col2 < n- 最多调用
104次sumRegion方法
实现代码
点击展开代码
矩形检查
二维差分
在遇到二维矩阵+区域覆盖时考虑二维差分,总体思路是对数据进行预处理后进行二维前缀和,得到的就是每个元素的变化值。
给定矩阵\(matrix\),进行\(k\)次操作,每次操作对以\([lx,ly]\)和 \([rx,ry]\)分别为左上顶点和右下顶点的矩形区域中的每个值加\(v\),则进行以下预处理:
pre[lx][ly]+=vpre[lx][ry+1]-=vpre[rx+1][ly]-=vpre[rx+1][ry+1]+=v
例题
题目链接:2132. 用邮票贴满网格图 - 力扣(LeetCode)
点击展开题目
给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据)。
给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩阵中,且满足以下 限制 和 要求 :
- 覆盖所有 空 格子。
- 不覆盖任何 被占据 的格子。
- 我们可以放入任意数目的邮票。
- 邮票可以相互有 重叠 部分。
- 邮票不允许 旋转 。
- 邮票必须完全在矩阵 内 。
如果在满足上述要求的前提下,可以放入邮票,请返回 true ,否则返回 false 。
示例 1:

示例 2:

提示:
m == grid.lengthn == grid[r].length1 <= m, n <= 1051 <= m * n <= 2 * 105grid[r][c]要么是0,要么是1。1 <= stampHeight, stampWidth <= 105
实现代码