【算法 】前缀和

数据说明:

        arr是初始数组即原数组

        d为arr的差分数组

        sum_d是d的前缀和数组

1、一维前缀和

问题引入:

        存在一个一维数组arr:1 3 7 5 2,现在要求求出 [ 1,3 ]的值,即arr[ 1 ] + arr [ 2 ] + arr[ 3 ]

sum[i] = \begin{cases} sum[i-1]+arr[i],&i>0\\ arr[0],&i=0 \end{cases}

例如:arr: 1 3 7 5 2

arr
13752
sum
14111618

那么sum[ L, R ] = sum[ R ] - sum[ L-1 ] (L > 0),  sum[ L, R ] = sum[ R ] (L = 0)

2、一维差分

问题引入:

        数组 arr 有 n 个数: 1,3,7,5,2

        m 个操作: [ L, R ] + value

        1个访问: arr

操作:[2 , 4] + 5        [ 1, 3 ] + 2        [0 , 2] - 3

做法:第一步:算出原数组arr的差分数组d

           第二步:利用公式将操作转化为在差分数组上的操作

           第三步:对差分数组进行前缀和求解sum_d

一维差分
13752
[2 , 4] + 5 1312107
[1, 3 ] + 2 1514127
[0 , 2] - 3-2211127

时间复杂度O(n*m),查分数组的求解公式如下

d[i]= \begin{cases} d[i]-d[i-1],&i>0\\ d[i],&i=0 \end{cases}

举例说明:

一维差分
01234
arr13752
d124-2-3
sum_d13752

差分数组的性质

① [ L , R] + value < = >d[L] +=value,d[R+1]-=value

举例①:        [2 , 4] + 5        [ 1, 3 ] + 2        [0 , 2] - 3,sum_d 数组就是操作后的结果

操作|差分数据124-2-3
[2 , 4] + 5129-2-3
[ 1, 3 ] + 2149-2-5
[0 , 2] - 3-2491-5
d-2491-5
sum_d-2211127

原理①:

        在原数组第 n 个位置上面 +1 相等于 在前缀和数组的第 n 个位置一直到最后都加上1.同理,想要得到 [L,R]+value,那么在原数组第 L 个位置 +value , 原数组第 R + 1 个位置 -value就行。然后进行 前缀和 计算就可以得到目标数组。

3、二维前缀和

 3.1 定义:sum[ i ][ j ] 是从(0,0)到(i,j)的和

3.2 sum[ x1 , y1 ] [ x2 , y2 ]

3.3 知道一个点g[i][j],求解sum[i][j]

参考文献[1] 前缀和​​​​​​​ 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值