算法 差分数组 | 前缀和
差分数组
差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。
对 nums
数组构造一个 diff
差分数组,**diff[i]
就是 nums[i]
和 nums[i-1]
之差**
1 | int[] diff = new int[nums.length]; |
1 | int[] res = new int[diff.length]; |
利用差分数组,我们可以高效地对原始数组的某个区间进行修改操作,而无需遍历整个区间。具体步骤如下:
- 对于要修改的区间
[start, end]
,将差分数组的diff[start]
增加value
,表示该区间起始位置的元素增加了value
。 - 将差分数组的
diff[end+1]
减去value
,表示该区间结束位置的下一个位置的元素减去了value
。
通过这样的操作,我们实际上是在修改差分数组中的两个位置,即对应于原始数组中修改区间起始位置和结束位置的下一个位置。
然后,我们可以根据差分数组重新构造原始数组。对差分数组进行前缀和操作,即 prefixSum[i] = prefixSum[i-1] + diff[i]
,得到还原后的原始数组。
差分数组的主要应用场景是在需要频繁修改某个区间内元素的情况下,通过差分数组可以将修改操作的时间复杂度降低为 O(1)。它常用于解决一些与区间修改相关的问题,例如范围加法、区间翻转等。
前缀和
应用举例:
1 | int[] scores; // 存储着所有同学的分数 |
求前缀和数组的模板:(感觉混乱就画个图)
1 | // 已知数组 nums |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 pineapple221的个人博客!
评论