1. 差分数组:区间操作的高效利器
在算法竞赛和实际开发中,我们经常会遇到需要对数组的某个区间进行统一增减操作的场景。比如统计航班预订座位数、处理批量订单数据、计算区域温度变化等。传统做法是直接遍历区间内的每个元素进行修改,但当数据量达到百万级时,这种暴力方法就显得力不从心了。
差分数组(Difference Array)正是为解决这类问题而生的高效数据结构。它能将区间操作的时间复杂度从O(n)降到O(1),最终查询操作保持O(n),特别适合"批量修改+最终查询"的场景。我第一次在ACM竞赛中遇到这类问题时,就被它的精妙设计所折服——仅通过两个简单的加减操作就能影响整个区间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 差分数组的核心原理
2.1 基本定义与构造
差分数组diff与原数组arr的关系可以用数学公式精确描述:
- diff[0] = arr[0]
- diff[i] = arr[i] - arr[i-1] (i > 0)
这个定义看似简单,却蕴含着强大的特性:差分数组的前缀和等于原数组。用数学表达式表示就是:
arr[k] = Σ diff[i] (i=0 to k)
这个特性是差分数组所有神奇操作的基石。在实际编码时,我习惯将diff数组长度设为n+1(比原数组多一个元素),这样可以简化边界条件的处理。
2.2 区间更新原理详解
差分数组最精妙的部分在于其区间更新机制。假设要对arr的[L,R]区间所有元素加val,只需要:
- diff[L] += val
- diff[R+1] -= val (当R+1 < n时)
为什么这样有效?让我们从数学角度分析:
- diff[L] += val会导致所有包含diff[L]的前缀和(即arr[L]到arr[n-1])都增加val
- diff[R+1] -= val则精确抵消了从arr[R+1]开始的多余增量
- 最终效果就是只有arr[L]到arr[R]增加了val
2.3 还原原数组
经过一系列区间操作后,我们需要通过差分数组还原最终的原数组。这个过程就是计算前缀和:
- arr[0] = diff[0]
- arr[i] = arr[i-1] + diff[i] (i > 0)
在实际编程中,我通常会直接在原数组上操作以避免额外的空间开销。这个还原过程的时间复杂度
