我们可以通过这个图看到我们的前缀和和这个差分实际上是一个互逆的过程。
我们假如想给所有的A数组中元素都加C。需要O(n)的时间复杂度。
但是如果我们把A数组中想加C的区间l,r在B数组的同样区间中加C,r 然后在r+1后面的区间每个B元素都-C。这样因为A是B的前缀和。所以也能完成同样的事情。但是这里的B只是给bl+C和b(r+1)-C。只是加了一个数和减去一个数,时间复杂度为O(1)。
所以我们差分的作用就显现出来了。
我们来看一下例题:
我们看看我们的java代码怎么去写这个题:
对了之前的差分还要补充一点,原数组a1......an可以看成是由一个长度为n,元素均为0的数组进行差分,每次加上对应元素形成的数组。
运行结果:
同样的:
如果我们想给一个数组a的一个区间内的每个元素都加上c也可以用之前的那种思想。
然后我们再来看一个题:差分矩阵
我们来看一下java代码怎么去写这个题:
运算结果: