差分是什么:
简单来说,就对于 a数组里面存的全部数据,把相邻的数据两两做差,这个大概就是差分了。
为什么要使用差分?我们依然选择举栗子解释:
假设有这么一堆数据:
{ 2, 4, -1, 3, 7, 1, -5, 8, 1, 62,4,−1,3,7,1,−5,8,1,6}
那么它的差分就是:
{ 2, 2, -5, 4, 4, -6, -6, 13, -7, 52,2,−5,4,4,−6,−6,13,−7,5}
考虑这个问题的一维版:一个序列,最开始全是 0 .每次区间加 1 ,最后输出每个数。
:
假设我们现在要给[2,5]这个区间加一。原来的序列是:
0 0 0 0 0 0 0 0
0 1 1 1 1 1 0 0
这时候差分
0 +1 0 0 0 -1 0
有什么用呢?从左往右扫描这个数组,记录当前经过的标签之和。这个和就是对应那个数的答案。
这样,对于每个区间加操作,只需要O(1) 的时间打上标记。
最后扫描输出即可。
现在把问题拓展到二维。假设我们要覆盖[(2,2),(5,5)] ,那么标记便可以这样打:
0 0 0 0 0 0
0 +1 0 0 0 -1
0 +1 0 0 0 -1
0 +1 0 0 0 -1
0 +1 0 0 0 -1
0 0 0 0 0 0
即在每一行都按照一维的方式来操作