前缀和算法
前缀和算法
什么是前缀和?
前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而拆分可以看成前缀和的逆运算。合理的使用前缀和与拆分,可以将某些复杂的问题简单化。
具体做法:
首先做一个预处理,定义一个sum[]
数组,sum[i]
代表a
数组中前i
个数的和。
求前缀和运算:
for(int i = 1;i <= n; i++)
{
sum[i] = sum[i - 1] + a[i];
}
查询操作:
printf("%d\n", sum[r] - sum[l - 1]);
原理
sum[r] = a[1] + a[2] + a[3] + a[l-1] + a[l] + a[l + 1] ...... a[r];
sum[l - 1] = a[1] + a[2] + a[3] + a[l - 1];
sum[r] - sum[l - 1] = a[l] + a[l + 1] + ......+ a[r];
这样,对于每个询问,只需要执行 sum[r] - sum[l - 1]
。输出原序列中从第l
个数到第r个数的和的时间复杂度变成了O(1)
。
我们把它叫做一维前缀和。
总结: