1. 差分数组原理与核心思想
差分数组是一种巧妙的数据结构优化技术,它通过存储相邻元素的差值而非元素本身,将区间更新操作的时间复杂度从O(n)优化到O(1)。这种思想在需要频繁进行区间增减操作的场景中具有显著优势。
1.1 基础概念解析
假设原始数组为A,其差分数组D定义为:
- D[0] = A[0]
- D[i] = A[i] - A[i-1] (i ≥ 1)
这个定义看似简单,却蕴含着一个重要特性:对差分数组求前缀和即可还原原始数组。这个特性是差分数组所有优化能力的根基。
提示:差分数组的长度通常比原始数组多1,这是为了处理右边界情况。在Java实现中,我们通常会声明
int[] diff = new int[n+1]
1.2 区间更新原理
传统区间更新需要对区间内每个元素逐个修改,时间复杂度为O(n)。而差分数组只需要修改两个点:
- 在区间起点
i处+k - 在区间终点
j+1处-k
这样操作后,当我们对差分数组求前缀和时,+k的效果会自动"扩散"到整个区间,而区间外的影响则被-k抵消。这种操作的时间复杂度是恒定的O(1),与区间长度无关。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 航段乘客统计案例详解
让我们通过一个实际的航空乘客统计案例,深入理解差分数组的应用。这个案例模拟了多条航线预订对航班各段乘客数的影响。
2.1 问题建模
假设航线为:杭州 → 西安 → 成都 → 兰州 → 新疆 → 拉萨 → 昆明(共6个航段)。我们需要计算飞机离开每个航段时的乘客数量。
预订信息包括:
- 杭州-西安 20人
- 杭州-新疆 16人
- 成都-兰州 25人
- 兰州-昆明 14人
2.2 差分数组初始化
我们初始化一个长度为7的差分数组(航段数+1),所有元素初始为0:
java复制int[] diff = new int[6 + 1]; // [0,0,0,0,0,0,0]
2.3 差分更新操作
按照右开区间[start,end)的约定,我们依次处理每条预订:
- 杭州-西安(航段0-1)20人:
java复制diff[0] += 20; diff[1] -= 20; // 结果:[20,-20,0,0,0,0,0]
