考虑数组 ,对其中的相邻元素两两作差(右边减左边),得到数组 。然后在开头补上 ,得到差分数组
这有什么用呢?如果从左到右累加 中的元素,我们就「还原」回了 数组 。
这又有什么用呢?现在把连续子数组 都加上 ,得到 。再次两两作差,并在开头补上 ,得到差分数组
对比 和 ,你会发现,对 中连续子数组的操作,可以转变成对差分数组 中两个数的操作。
对于数组 ,定义其差分数组(difference array)为
性质 1:从左到右累加 中的元素,可以得到数组 。
性质 2:如下两个操作是等价的。
利用性质 2,我们只需要 的时间就可以完成数组 上的区间操作。最后利用性质 1 从差分数组复原出数组 。
# 你有一个长为 n 的数组 a,一开始所有元素均为 0。
# 给定一些区间操作,其中 queries[i] = [left, right, x],
# 你需要把子数组 a[left], a[left+1], ... a[right] 都加上 x。
# 返回所有操作执行完后的数组 a。
def solve(n: int, queries: List[List[int]]) -> List[int]:
diff = [0] * n # 差分数组
for left, right, x in queries:
diff[left] += x
if right + 1 < n:
diff[right + 1] -= x
for i in range(1, n):
diff[i] += diff[i - 1] # 直接在差分数组上复原数组 a
return diff欢迎关注 B站@灵茶山艾府