差分数组
1.问题背景
例如:我们现在有一个100000容量的数组,现在要求我们从索引i开始j结束,对于所有的元素进行+1操作。解决这个问题比较直观的一个解决方法是进行一个for循环从i开始j结束一次对过程中的每一个元素进行+1操作。但是如果我们要经常的对个数组进行连续空间的操作,这样是不是有点太费时间了,我们需要想到一个好的办法节省时间的开销。
2.解决方案
我们都知道,计算机解决优化时间复杂度的方法基本是都是通过增加空间的消耗来完成的。因此,我们将引出接下里的主角差分数组。
3.差分构造
那么什么是差分数组,本质上这个也是一个数组,只是求差而已。我们引入下面的公式:
例如,我们可以看下面的数组:
然后根据公式构造他的差分数组:
4.应用
那么我们构造一个差分数组有什么用呢?仅仅为了浪费空间吗?存在即合理
差分数组可以很好的解决我们开始提出的问题,假如我们需要从索引i开始j结束,对于所有的元素进行+1
操作,我们可以直接在差分数组的索引的i处+1
然后在索引j+1处-1
那我们就完成了我们需求的操作,只不过是我们的操作存到了差分数组中。在我们需要的时候,可以直接根据差分数组求出来索引处的值即可。
例如我们要对上图中 2-4的索引处+1
,那么我们对2处的差分数组+1
对5处的-1
即可完成操作。