(一)前缀和的定义
假设有一个字符串ABCDE,那么A,AB,ABC,ABCD,ABCDE就是这个单词的前缀,就是从第一个字符开始,依次往后拼接。而E,ED,EDC,EDCB,EDCBA称为这个单词的后缀。
那么对于一个int类型数组的前缀,例如数组a=[0,12,62,33,4,55],我们维护一个由前缀的和组成的一个数组sum,sum[i]表示数组中a[0]~a[i]的和。其中a[0]默认为0,若:
- sum[0]=a[0]=0
- sum[1]=a[0]+a[1]
- sum[2]=a[0]+a[1]+a[2]
- sum[3]=a[0]+a[1]+a[2]+a[3]
- sum[4]=a[0]+a[1]+a[2]+a[3]+a[4]
那么sum就是数组a的前缀和数组。
(二)前缀和的作用
前缀和我们可以用预处理(边输入边维护)来进行存储,能大大降低查询的世界复杂度。因为前缀和的主要目的是求子数组的和的大小。例如,元素a[1]到a[3]的和:a[1]+a[2]+a[3],这个for循环进行的话需要用O(n)的时间,而用前缀和sum[3]-sum[0]来解决就是O(1)的复杂度,为什么sum[3]-sum[0]就是a[1]到a[3]的和呢?
我来解释一下,给一个更鲜明的例子,求元素a[3]到a[5]的和:a[3]+a[4]+a[5],前缀和用起来就是sum[5]-sum[2],为什么呢?我们来拆开看看: