差分数组和前缀和数组

前缀和数组

前缀和:新建一数组B,数组中每一项B[i]保存A中[0…i]的和;

sum[i] = a[1] + a[2] + ... + a[i];

前缀和相邻两数之差sum[i]-sum[i-1]是原数组a[i]

sum[i]-sum[i-1] = a[i];

原数组a的某个区间[l, r]内的累加和,可以用前缀和数组两个元素的相减表示

sum[r] - sum[l-1] = a[l] + a[l+1] + ... + a[r-1] + a[r];

可以通过常数的时间,求出原数组a的某个区间的累加和

例如:给定一个数组,求某个区间内的最大累加和,可以枚举右端点r,然后选取前缀和sum[l]最小的左端点l,然后尝试更新答案即可

 

类似的:

给一数组A,

前缀和:新建一数组B,数组中每一项B[i]保存A中[0…i]的和;

后缀和:新建一数组B,数组中每一项B[i]保存A中[i…n-1]的和;

前缀积:新建一数组B,数组中每一项B[i]保存A中[0…i]的积;

后缀积:新建一数组B,数组中每一项B[i]保存A中[i…n-1]的积;

 

差分数组:

差分数组对应的概念是前缀和数组,对于数组 [1,2,2,4][1,2,2,4],其差分数组为 [1,1,0,2][1,1,0,2],差分数组的第 ii 个数即为原数组的第 i-1i?1 个元素和第 ii 个元素的差值,也就是说我们对差分数组求前缀和即可得到原数组。

差分数组的性质是,当我们希望对原数组的某一个区间 [l,r]施加一个增量inc 时,差分数组 d 对应的改变是:d[l] 增加 inc,d[r+1] 减少inc。这样对于区间的修改就变为了对于两个位置的修改。并且这种修改是可以叠加的,即当我们多次对原数组的不同区间施加不同的增量,我们只要按规则修改差分数组即可。

 

例如:航班预订统计 - 航班预订统计 - 力扣(LeetCode) (leetcode-cn.com)

 

ps:注意考虑边界

差分数组和前缀和数组

上一篇:Unity 一键自动截图切换截多个屏幕尺寸


下一篇:拍平数组/数组扁平化