【算法】数组的前缀和 Prefix Sum
算法中有前缀和这样一种很好的数据结构,它能极大地降低区间查询的时间复杂度 => Prefix sum常常用于求subarray的题目,或则是一些连续的值的和
前缀和 - Prefix Sum
它是这样的,假如有这样一个数组(序列), A = [a1, a2, a3, a4, a5, a6, a7, a8] ==> 那么它的前缀和 Prefix Sum数组应该是如下: prefixSum = [sum1, sum2, sum3, sum4, sum5, sum6, sum7, sum8]
它的计算方式是这样的: sum1 = a1;
sum 2 = a1 + a2 = sum1 + a2
sum3 = a1 + a2 + a3 = sum2 + a3
sum4 = a1 + a2 + a3 + a4 = sum3 + a4
sum5 = a1 + a2 + a3 + a4 + a5 = sum4 + a5
得到前缀和 Prefix Sum数组后,比如我们现在要求计算数组A中a1和a5之间的区间值, 或者说是a3和a7之间的区间值
显然a1和a5之间的区间值 = sum5 - sum1 a3和a7之间的区间值 = sum7 - sum3
现在有一道LeetCode上面的算法题是这样的 => Subarray Sum Equals K 也就是说给一个数组 A = [a1, a2, a3, a4, a5, a6, a7, a8], 以及一个整数K, 计算差值为K的两个元素的区间数
比如整个数组A中有 (a1+a2+a3) - a1 = K 和 (a1+a2+a3+a4+a5)- (a1+a2) =K ,那么区间数为2
如果a1+a2+....+a8 = K 也就是说整个A数组的值加起来也等于K, 那么这也算一个区间
如果整个数组中没有任何一个区间的值=K, 那么返回0
这个题目显然应该用Prefix Sum来实现