差分指的是将数组中每个元素与其相邻元素之间的差值进行计算,并将结果保存到另一个数组中的操作。
具体地,如果原数组为a,则差分后得到的新数组为d,其中d[i]=a[i]-a[i-1]。
如果需要对差分后的数组进行还原,也就是将其转化为原数组,只需要对差分数组d进行前缀和操作,即可得到原数组a。
2.1 数组区间修改
差分的一个重要应用是对数组进行区间修改。如果需要对原数组a[l...r]的每个元素都加上一个常数c,可以将差分数组d中的d[l]加上c,将d[r+1]减去c,然后再对差分数组进行还原,即可得到a[l...r]+c的结果。
2.2 数组区间求和
利用差分数组,可以非常高效地求解子区间[l,r]的和,只需要计算差分数组d[l]+d[l+1]+...+d[r]即可。
对于长度为n的数组,计算差分数组的时间复杂度为O(n)。
对于差分数组d的区间修改或求和操作,只需要计算O(1)次即可。
因此,利用差分技巧,可以将某些O(n)的算法优化至O(1)。