前缀和与差分
一维前缀和
前缀合数组表示: 1
2
3
4
5a=[]
ls=[]
ls[0]=a[0]
for i in range(1,n):
ls[i]=ls[i-1]+a[i]
在创建前缀和数组以后,如果要查询原数组在区间[a,b]上的元素和,只需要使用公式pre_sum[b]-pre_sum[a-1]即可。
1 | pre_sum=[n] |
一维差分
差分数组构造: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 给定的数组 a
a = [1, 3, 3, 5, 10]
# 1. 写出差分数组
a=[1,2,3,4,5,6,7]
diff=[]
def get_diff_array(a):
n = len(a)
diff = [a[0]] # 差分数组的第一个元素就是原数组的第一个元素
for i in range(1, n):
diff.append(a[i] - a[i - 1]) # 相邻元素两两作差
return diff1
2diff[l]+=2
diff[r+1]-=2
二维前缀和
前缀和的构造:对于a[i][j]的前缀和,等于左上的值+左前缀和+上前缀和-左上前缀和
构造二维前缀和数组时,可以现在最外层加一圈0。 1
2
3
4
5
6
7
8
9
n, m = len(grid), len(grid[0]) # 得到行数和列数
s = [[0] * (m + 1) for _ in range(n + 1)] # 初始化二维前缀和数组
for i in range(1, n + 1):
for j in range(1, m + 1):
s[i][j] = (
s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + grid[i - 1][j - 1]
)1
2def get_sum(x1, y1, x2, y2):
return s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]
二维差分处理的部分右下。一般思路为先把差分矩阵写出来,再将其前缀和并作用于原矩阵。
1 | diff=[[0]*(n-1 for _ in range(n+1))]#防越界 |

