接着上次,同样的样例
下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
原数组 a[i] | 3 | 7 | 2 | 8 | 5 | 14 | 2 |
前缀和 sum[i] | 3 | 10 | 12 | 20 | 25 | 39 | 41 |
差分 diff[i] | 3 | 4 | -5 | 6 | -3 | 9 | -12 |
如果我将a[3]到a[6]的所有数+2,表格更新如下
下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
原数组 a[i] | 3 | 7 | 4 | 10 | 7 | 16 | 2 |
前缀和 sum[i] | 3 | 10 | 14 | 24 | 31 | 47 | 49 |
差分 diff[i] | 3 | 4 | -3 | 6 | -3 | 9 | -14 |
我们发现,diff数组的 diff[3]和diff[7]发生了改变
diff[3]+2,diff[7]-2
我们可以得知
如果把a[x]到a[y]全部加上z
可以将diff[x]+=z;diff[y+1]-=z;
再根据上篇文章的规律(差分数组求前缀和等于原数组),表格如下:
下标 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
原数组 a[i] | 3 | 7 | 4 | 10 | 7 | 16 | 2 |
差分 diff[i] | 3 | 4 | -3 | 6 | -3 | 9 | -14 |
前缀和 sum[i] | 3 | 7 | 4 | 10 | 7 | 16 | 2 |
所以想要将a[x]到a[y]全部加上z,可以先求出差分数组,将diff[x]+=z; diff[y+1]-=z,再求前缀和,可以快速求出想要的值,时间复杂度为O(n)