数据说明:
arr是初始数组即原数组
d为arr的差分数组
是d的前缀和数组
1、一维前缀和
问题引入:
存在一个一维数组arr:1 3 7 5 2,现在要求求出 [ 1,3 ]的值,即arr[ 1 ] + arr [ 2 ] + arr[ 3 ]
例如:arr: 1 3 7 5 2
1 | 3 | 7 | 5 | 2 |
1 | 4 | 11 | 16 | 18 |
那么sum[ L, R ] = sum[ R ] - sum[ L-1 ] (L > 0), sum[ L, R ] = sum[ R ] (L = 0)
2、一维差分
问题引入:
数组 arr 有 n 个数: 1,3,7,5,2
m 个操作: [ L, R ] + value
1个访问: arr
操作:[2 , 4] + 5 [ 1, 3 ] + 2 [0 , 2] - 3
做法:第一步:算出原数组arr的差分数组d
第二步:利用公式将操作转化为在差分数组上的操作
第三步:对差分数组进行前缀和求解
1 | 3 | 7 | 5 | 2 | |
[2 , 4] + 5 | 1 | 3 | 12 | 10 | 7 |
[1, 3 ] + 2 | 1 | 5 | 14 | 12 | 7 |
[0 , 2] - 3 | -2 | 2 | 11 | 12 | 7 |
时间复杂度O(n*m),查分数组的求解公式如下
举例说明:
0 | 1 | 2 | 3 | 4 | |
arr | 1 | 3 | 7 | 5 | 2 |
d | 1 | 2 | 4 | -2 | -3 |
1 | 3 | 7 | 5 | 2 |
差分数组的性质:
①
举例①: [2 , 4] + 5 [ 1, 3 ] + 2 [0 , 2] - 3, 数组就是操作后的结果
操作|差分数据 | 1 | 2 | 4 | -2 | -3 |
[2 , 4] + 5 | 1 | 2 | 9 | -2 | -3 |
[ 1, 3 ] + 2 | 1 | 4 | 9 | -2 | -5 |
[0 , 2] - 3 | -2 | 4 | 9 | 1 | -5 |
d | -2 | 4 | 9 | 1 | -5 |
-2 | 2 | 11 | 12 | 7 |
原理①:
在原数组第 n 个位置上面 +1 相等于 在前缀和数组的第 n 个位置一直到最后都加上1.同理,想要得到 [L,R]+value,那么在原数组第 L 个位置 +value , 原数组第 R + 1 个位置 -value就行。然后进行 前缀和 计算就可以得到目标数组。
3、二维前缀和
3.1 定义:sum[ i ][ j ] 是从(0,0)到(i,j)的和
3.2 sum[ x1 , y1 ] [ x2 , y2 ]
3.3 知道一个点g[i][j],求解sum[i][j]
参考文献[1] 前缀和