前缀和算法求数组中某个区间的

前缀和算法

对于一个数组,我们求数组中某个区间的和,如果通过遍历相加的话,时间复杂度为n。若分别求m个区间的和,则所需时间复杂度为m*n。因此我们可以使用前缀和算法优化它的时间复杂度。

我们可以利用一个数组,存储上面数组中0到每个位置区间的和。

如上图,下面的前缀和数组存储,上面区间和时是从数组1位置开始的,而不是数组0位置开始的。1位置存储的就是上面数组第一个数字到第一个数字区间的和,第2个位置存放的是上面数组第一个数字到第二个数组区间的和。这里前缀和数字从1开始存放,而不是从0开始存放,是为了后面处理边界的问题。

这里我们求前缀和数组中的值时,可以使用前缀和数组该位置对应的上面数组的值加上,前缀和数组该位置上一个位置里面的值,从而优化计算。如,求前缀和数组6下标的值,可以用上面数组第6个数加上前缀和下标5的值。

现在我们知道了从第1个数,到第n个数区间的和,那么我们要求如4到8之间的和,该怎么求呢?

第4个数和第8个数,在上面数组对应坐标为3和7,我们发现,该区间的和,就等于第1个数到第8个数的和减去第一个数的到第3个数的和。

因此转化为公式就是:

如求第n个数,到第m个数这个区间的和。

前缀和数组m - 前缀和数组n-1。

这里我们可以看出,为什么前缀和数组要从下标1开始存,比如求第1个数到第4个数区间和,带入公式为前缀和数组4 - 前缀和数组0。

相关推荐
David猪大卫1 天前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger1 天前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz1 天前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化1 天前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu1 天前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu1 天前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖1 天前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
沫璃染墨1 天前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
自信150413057591 天前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
ShineWinsu2 天前
对于Qt:QDial常见属性以及信号的解析
开发语言·c++·qt·gui·客户端·旋钮·qdial