a = [0,1,3,4,6,9]
对a进行多个操作,
在区间[1,3]中每个元素加+3,
在区间[2,4]中每个元素加+2,
在区间[2,5]中每个元素加-4,
那么会得到什么样的数组呢?
a = [0,1,3,4,6,9]
a1 = [0,4,6,7,6,9] # 在区间[1,3]中每个元素加+3
a2 = [0,4,8,9,8,9] # 在区间[2,4]中每个元素加+2
a3 = [0,4,4,5,4,5] # 在区间[2,5]中每个元素加-4
但是这样做比较费时间,有没有好的办法呢?请看下文
使用差分数组的办法,可以大幅度减少时间复杂度
什么是差分数组?
差分数组内的元素就是a[i] - a[i-1]
a = [0,1,3,4,6,9]
a1 = [0,4,6,7,6,9] # 在区间[1,3]中每个元素加+3
a2 = [0,4,8,9,8,9] # 在区间[2,4]中每个元素加+2
a3 = [0,4,4,5,4,5] # 在区间[2,5]中每个元素加-4
用差分:
diff = [0,1,2,1,2,3]
diff1 = [0,4,2,1,-1,3] # 在原数组(a)区间[1,3]中每个元素加+3
可见只需要对diff的diff[L]和diff[R+1]进行处理,diff[L] += value,diff[R+1] -= value
diff2 = [0,4,4,1,-1,1] # 在区间[2,4]中每个元素加+2
diff3 = [0,4,0,1,-1,1] # 在区间[2,5]中每个元素加-4
尤其需要注意:如果R+1(eg:5+1)不存在,那么则不需要diff[R+1] -= value
差分数组的两个重要性质:
1、差分数组前缀和等于原数组中的a[i]
这句话什么意思呢,我来举个例
a = [0,1,3,4,6,9]
diff = [0,1,2,1,2,3]
a[5] = diff[1] + diff[2] + diff[3] + diff[4] + diff[5]
2、对原数组a进行区间增减操作,相对应的只需要对差分数组进行如下操作:
diff[L]+=value和diff[R+1]-=value
# R+1如果超界,那就不管diff[R+1]-=value,直接diff[L] += value