差分数组详解
差分数组(Difference Array)是前缀和数组的逆操作,用于快速对数组的某个区间进行增量更新。
概念
差分数组是前缀和数组的逆操作,用于快速对数组的某个区间进行增量更新。
工作原理
graph TB
A["原数组
arr = [1, 2, 3, 4, 5]"] --> B["差分数组
diff = [1, 1, 1, 1, 1]"]
B --> C["区间 [i, j] 加 val
diff[i] += val
diff[j+1] -= val"]
C --> D["前缀和还原
arr = prefixSum(diff)"]
style A fill:#e1f5ff
style B fill:#e8f5e9
style C fill:#fff3e0
style D fill:#f3e5f5
核心思想
- 差分数组:
diff[i] = arr[i] - arr[i-1](i > 0),diff[0] = arr[0] - 区间更新: 对区间
[l, r]加val,只需更新diff[l] += val和diff[r+1] -= val - 还原数组: 对差分数组求前缀和即可得到原数组
实现示例
Go 语言实现
1 | package main |
更新流程示例
sequenceDiagram
participant U as 用户
participant DA as DifferenceArray
participant A as 原数组
U->>DA: 创建差分数组
DA->>A: 读取原数组 [1,2,3,4,5]
A-->>DA: 返回数组
DA->>DA: 构建 diff = [1,1,1,1,1]
U->>DA: Update(1, 3, 2)
DA->>DA: diff[1] += 2 → diff[1] = 3
DA->>DA: diff[4] -= 2 → diff[4] = -1
U->>DA: GetArray()
DA->>DA: 前缀和还原
DA-->>U: 返回 [1,4,5,6,5]
应用场景
- 区间更新问题: 多次对数组的某个区间进行增量更新
- 航班预订统计: 记录每个航班的预订数量变化
- 会议室安排: 统计每个时间段的会议数量
复杂度分析
- 空间复杂度: O(n)
- 构建时间复杂度: O(n)
- 更新时间复杂度: O(1)
- 查询时间复杂度: O(n)(需要前缀和还原)