接着上次,同样的样例
| 下标 | 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)
文章介绍了如何使用差分数组来高效地更新数组中一段连续元素的值。通过增加或减少差分数组的特定项,可以便捷地计算出数组的修改后状态,且时间复杂度仅为O(n)。这种方法特别适用于需要频繁局部更新和查询的场景。
1155

被折叠的 条评论
为什么被折叠?



