前缀和&差分

文章介绍了前缀和与差分这两种优化查询区间和与修改数组的方法。前缀和用于快速计算数组一段区间的和,二维前缀和扩展到二维数组,可以高效求解矩形区域的和。差分数组则用来高效地进行区间加法操作,二维差分影响原数组及其右下角的数值,适用于二维数组的修改操作。这些技术显著降低了时间复杂度,从O(q*n)降至O(q)。
摘要由CSDN通过智能技术生成

前缀和

前缀和:一段序列里的前n项和

给出n个数,在给出q次问询,每次问询给出L、R,快速求出每组数组中一段L至R区间的和

给出一段数组,每次问询为求出l到r区间的和

普通方法:L到R进行遍历,那么在每次求区间和的过程中时间复杂度为O(n),q次问询时间复杂度为O(q*n)

前缀和:建立前缀和数组,sum[i]=sum[i-1]+arr[i]。(i-1存在越界的问题,所以i从1开始遍历)

              计算L到R的区间和,包括arr[L]和arr[R]两个值(边界值),区间和=arr[R]-arr[L-1]

              时间复杂度从O(q*n)降至O(q*1)

二维前缀和

二维前缀和数组是原数组它本身位置的数及其左上角全部的数

 

二维前缀和的应用:求二维数组中arr[x1][y1]到arr[x2][y2]区间内的数之和 

差分

给出n个数,再给出q次问询,每次问询给出L、R、X,要求在L到R上每一个值都加上X,直到最后输出这个数组 

普通方法:遍历,时间复杂度为O(q*n)

差分:建立差分数组,difference[i]=arr[i]-arr[i-1],arr[i]=difference[i]+arr[i-1]。

        (同样i从1开始遍历)

          时间复杂度从O(q*n)降至O(q*1)

数组arr

111111

差分数组difference

100000

此时,L=2,R=4,X=1

操作方式:difference[L]=difference[L]+X,影响L之后的数字

                  difference[R+1]=difference[R+1]-X,避免影响R+1以及之后的数字

操作后的差分数组difference

1100-10

还原后的数组arr

122211

二维差分

一维差分修改差分数组中的某个数,影响的是原数组它本身及其之后的数

二维差分修改差分数组中的某个数,影响的是原数组它本身及其右下角全部的数

二维差分的应用:对以 x1, y1 为左上角, x2, y2 为右下角的矩阵插入一个值 / 修改值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值