算法前缀和
前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。
一维数组前缀和:
举一个例子:
输入一个长度为n
的整数序列。接下来再输入m
个询问,每个询问输入一对l
, r
。对于每个询问,输出原序列中从第l
个数到第r
个数的和。
我们很容易想出暴力解法,遍历区间求和。
时间复杂度为O(n * m)
,如果n
和m
的数据量稍微大一点就有可能超时,而我们如果使用前缀和的方法来做的话就能够将时间复杂度降到O(n + m)
,大大提高了运算效率。
具体做法定义一个sum数组,sum[i]代表数组a中前i个数和。
原理:
二维数组前缀和:
可以推出:
所以二维数组前缀和结论为:
(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的和为:
s[x2,y2]-s[x1-1,y2]-s[x2,y1-1]+s[x1-1,y1-1].