【数据结构与算法】差分数组
定义
设原数组为a
,长度为n
,在a
上构造它的差分数组d
,构造方法如下:
由此可得差分数组d
的定义:
- 差分数组是一个原数组长度相等的数组,其中元素表示原数组相邻元素的差。
性质
对差分数组d
求前缀和:
代入上述定义式可得:
由此可得差分数组d
的
性质1
- 差分数组的前缀和
preSum[i]
等于其原数组中的对应元素a[i]
。
继续对原数组a
求前缀和:
由此可得
性质2
- 原数组的前缀和可以由差分数组求得。
用途
区间修改
根据上述性质1,可以把对原数组中元素的修改转化为对差分数组的修改。特别地,对于区间的批量修改,若对原数组的某个区间[l, r]
中的所有元素都增加x
,只需要对差分数组执行以下操作:
1 | d[l] += x; |
- 对
d[l] += x
:由于差分是前缀和的逆向过程,这个操作对于将来的查询而言,带来的影响是对于所有的下标大于等l
的位置都增加了值x
; - 对
d[r+1] -= x
:由于我们期望只对[l, r]
[产生影响,因此需要对下标大于r
的位置进行减值操作,从而抵消“影响”。
单点查询
- 利用性质1,可以通过求差分数组的前缀和来查询原数组中的某个元素。
- 利用性质2,可以通过公式计算原数组的前缀和/区间和。
技巧
构造差分数组时,不一定需要直接使用原数组,有时候可以使用区间修改的方式。
例如:1109. 航班预订统计
对于涉及区间修改、单点查询的区间求和问题,可以考虑使用差分数组。
相关题目
…待补充
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 namespace LANG!
评论