【算法】数组的前缀和 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来实现

 

posted on 2023-02-19 14:18  新西兰程序员  阅读(243)  评论(0编辑  收藏  举报