一维数组下标灵活应用
一维前缀和
目标:
什么是前缀和;
怎么求前缀和;
预处理前缀和方便解决什么问题
1、给 定 一 个 数 组 A[1…n], 前 缀 和 数 组 PrefixSum[1…n] 定 义 为 : PrefixSum[i] = A[0]+A[1]+…+A[i-1];
例如:A[5,6,7,8] --> PrefixSum[5,11,18,26]
PrefixSum[0] =A[0] ;
PrefixSum[1] =A[0] + A[1] ;
PrefixSum[2] =A[0] + A[1] + A[2] ;
PrefixSum[3] =A[0] + A[1] + A[2] + A[3] ;
2、那么当我们预处理出前缀和后,就可以快速求得任意的区间和了,对亍一个区间[l, r],
A[l] + A[l+1] + A[l+2] + .. + A[r] = PrefixSum[r] - PrefixSum[l-1]。
最简单的一道题就是给定 n 个数和 m 次询问,每次询问一段区间的和。求一个 O(n + m) 的做法。
用 O(n) 前缀和预处理,O(m) 询问。
for(int i = 1; i <= n; i++)
PrefixSum[i] = PrefixSum[i - 1] + A[i]; //O(n) //前缀和的求法
while(m--){ //O(m)
int L, R;
scanf("%d%d", &L, &R);
printf("%d\n", PrefixSum[R] - PrefixSum[L - 1]);
}