定义:
对于大小为n的数组arr,定义其差分数组d,差分数组和原来数组arr大小相同,且d[i] = arr[i] - arr[i-1] (i>=1); d[0] = arr[0]
差分数组:定义差分数组为d,差分数组和原来的arr数组大小一样,且d[i] = arr[i] - arr[i-1] ( i >=1) d[0] = arr[0]
含义:原来数组i位置的元素和i-1位置的元素作差,得到的值就是d[i]的值
构造差分数组的用途:以空间换时间的高效
区间操作:在区间1~4上,所有数值都加上3;不需要遍历arr 1~4的范围,然后分别给每个值加上3,此时更改差分数组d即可。
差分数组d 在 2~4范围内的值都不用改变,只需改变差分数组 位置1 和位置 5的值即可,即,d[1] = d[1] + 3, d[5] = d[5] - 3;其余不变
依据:d[i] = arr[i] - arr[i-1]'
此时,我们想知道,arr中1~4中某项的值只需要根据差分数组即可获得:
由于
d[0] = arr[0] - 0 -> arr[0] = d[0]
d[1] = arr[1] - arr[0] -> arr[1] = d[1] + arr[0] -> arr[1] = d[1] + d[0]
d[2] = arr[2] - arr[1] -> arr[2] = d[2] + arr[1] -> arr[2] = d[2] + d[1] + d[0]
d[i] = arr[i] - arr[i-1] -> arr[i] = d[i] + arr[i-1] -> arr[i] = d[i] + ... +d[0]
即,arr[i] 等于 差分数组d的前缀和
总结:对数组arr区间LR范围内所有数进行相同的操作(所有元素加c),我们不需要遍历从LR的所有元素进行操作
只需构建差分数组d,在差分数组d中改变L和R+1的值即可(d[L] = d[L] + c, d[R+1] = d[R+1] - c)
查询arr/用差分数组求出数组arr的前缀和: