差分数组 ~~

给定一个序列 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的位置进行操作,可能会发生越界

看下运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值