1. 二维前缀和
一维前缀和的回顾
在一维前缀和中,我们用一个数组pre
来存储数组arr
的前缀和,pre[i]
表示从arr[0]
到arr[i]
的累加和。通过前缀和,我们可以在常数时间内求出任意区间[l, r]
的和,计算公式为: 区间和=pre[r]−pre[l−1]
二维前缀和的类比
在二维前缀和中,我们处理的是一个矩阵(二维数组)。假设有一个矩阵mat
,我们用一个二维数组pre
来存储二维前缀和。pre[i][j]
表示从矩阵的左上角(0,0)
到(i,j)
这个矩形区域内的所有元素的累加和。
二维前缀和的计算公式
假设矩阵mat
的大小为m×n
,二维前缀和pre
的计算公式如下: pre[i][j]=mat[i][j]+pre[i−1][j]+pre[i][j−1]−pre[i−1][j−1]
解释:
-
mat[i][j]
是当前元素。 -
pre[i - 1][j]
是当前行左边的累加和。 -
pre[i][j - 1]
是当前列上边的累加和。 -
pre[i - 1][j - 1]
是左上角重复计算的部分,需要减去。
类比理解: 想象一个棋盘,mat[i][j]
是一个棋子的价值,pre[i][j]
是从棋盘左上角到(i,j)
这个矩形区域内的所有棋子的总价值。我们通过累加左边和上边的总价值,再减去重复计算的左上角部分,得到当前矩形的总价值。
二维前缀和的应用
假设我们要计算矩阵中从(x1, y1)
到(x2, y2)
的子矩阵的和,可以直接通过前缀和数组快速求解: 子矩阵和=pre[x2