C++ vector区间增量更新的高效替代遍历方案问询
问题解答
存在,用差分数组方案就能把单次区间更新的时间复杂度从O(r-l+1)降到O(1),如果后续需要获取全量最终数组,再统一做一次前缀和计算即可,适合有多次区间更新、最后统一取结果的场景。
实现逻辑
- 先构造一个和原数组大小相同的差分数组
diff,初始所有元素为0 - 单次对区间[l, r]执行加k操作时,仅需要完成两个赋值操作:
diff[l] += k- 如果r+1小于数组总长度,执行
diff[r+1] -= k
- 所有区间更新操作完成后,对
diff数组计算前缀和,得到的就是最终的原数组
示例验证
你给出的示例初始v长度为7,l=2、r=5、k=1:
- 差分数组初始为
[0,0,0,0,0,0,0] - 执行
diff[2] += 1、diff[6] -=1,得到更新后的差分数组[0,0,1,0,0,0,-1] - 对差分数组计算前缀和:
- 第0位:0 → 原数组v[0]=0
- 第1位:0+0=0 → v[1]=0
- 第2位:0+1=1 → v[2]=1
- 第3位:1+0=1 → v[3]=1
- 第4位:1+0=1 → v[4]=1
- 第5位:1+0=1 → v[5]=1
- 第6位:1 + (-1) =0 → v[6]=0
最终结果和预期完全一致。
适用场景说明
如果你的使用场景只需要做单次区间更新、更新后立刻要随机访问某个位置的元素,那差分数组需要额外的前缀和计算步骤,优势不明显;但如果存在多次区间更新操作,最后才需要获取完整数组或者批量访问结果,差分数组的性能提升会非常显著,更新次数越多收益越高。
内容的提问来源于stack exchange,提问作者Sanket Kale
相关产品推荐
相关产品推荐

