给定一个序列 arry = [2,4,1,5,3]
看下其差分序列 d = [2,2,-3,4,-2]
如果对差分序列求前缀和 sum = [2,4,1,5,3]
可以看到为原数组 :
如果我们相对原序列进行K次操作;举个例子
1、对arry[1~3]进行+1操作
2、对arry[0~4]进行 +3操作
求进行完这两次操作后数组为多少 ;
我们观察 差分序列求前缀和的操作,如果我想给1-3位置的元素+1,那我给差分数组1位置的元素标记+1,那么在进行前缀和操作的时候,1位置后面所有的元素都会+1;
但我只想给1-3位置的元素+1;那我们可以给4位置的元素标记-1,那么4位置后面所有的元素又会-1,抵消掉一开始的+1,那么功能不就实现了吗;走一下:
2 2 -3 4 -2
**+1 ******-1
+3
算下前缀和:
5 8 5 9 6
可以看到就是我们想要的答案
那么可以抽象出来:
进行K次区间操作[start,end,,value]
每次给差分数组的d[start] + value d[end+1]-value
进行k次标记后
进行求前缀和操作
写下代码:
#对数组进行k次操作 输入格式 【start end op】
#start 代表起始位置 end代表结束位置 op代表加数
print('please input arry:')
n = list(map(int,input().split()))
n.append(0) #防止越界
print('please input opreate:')
op = [] #保存k次操作
strs = list(map(int,input().split()))
while strs: #将操作放到list中
op.append(strs[0:3])
strs = strs[3::]
length = len(op) #计算出要进行几次操作
#求差分数组
length_n = len(n)
d = []
d.append(n[0])
for i in range(1,length_n):
d.append(n[i] - n[i-1])
#对差分数组进行标记
for i in range(length):
start = op[i][0] - 1
end = op[i][1]
operator = op[i][2]
d[start] += operator
d[end] -= operator
#求前缀和
for i in range(1,length_n):
d[i] += d[i-1]
print(d[:length_n -1])
要注意下第6行:为什么要加个0,因为如果我们对[length-1]操作的话,就会给length的位置进行操作,可能会发生越界
看下运行结果: