当前位置: 首页 > news >正文

前缀和处理数组区间之和问题

1.什么是区间和问题

“区间和问题”通常指的是涉及计算或处理数组或数列某个子区间(即一段连续元素)的总和的类型问题。这类问题可能有多种变体和不同的复杂度,但基本思想都是在给定的区间内快速计算总和或处理与区间和相关的操作。

2.例题

题目描述

给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。

输入描述

第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间下标:a,b (b > = a),直至文件结束。

输出描述

输出每个指定区间内元素的总和。

3.解题思路

在看到题目的第一反应,大多数同学认为这是一道非常简单的数组求和问题,只需要将区间中对应下标的元素依次相加即可,但通过这种方法提交问题往往会编译超时。why?取极端情况:如果我次次查询的范围都是n-1到0,那么算法的复杂度是O(n * m) m,也就是查询的次数。可见查询次数非常多,而且时间也很长。
所以,为了加速区间和的查询,可以创建一个前缀和数组。前缀和数组 P[i] 表示原数组 A 从第1个元素到第 i 个元素的和。利用前缀和数组可以在 O(1) 时间内计算任意区间的和:
在这里插入图片描述

通过上面的图示可以看出,Sum(a,b)=P[b]−P[a−1]
注意这里a不可以为0,a为0要单独考虑:Sum(0,b)=P[b]
计算前缀和数组的时间复杂度是 O(n),每个查询时间复杂度是 O(1)。
在这里插入图片描述

有了前缀和数组之后,我们就可以在输入原数组元素时,设定一个累加变量,输入一次累加变量就增加一次。而前缀和数组的每个元素大小就是对应的累加变量的大小。
代码如下:

# include <iostream>
# include <vector>
using namespace std;
int main(){int n,a,b;scanf("%d",&n);vector<int> vec(n);vector<int> p(n);int presum=0;for(int i=0;i < n;i++){scanf("%d",&vec[i]);presum+=vec[i];p[i]=presum;}while(~scanf("%d%d", &a, &b)){int sum;if(a==0) sum=p[b];else sum = p[b]-p[a-1];printf("%d\n",sum);}
}

4.小节

1.scanf 函数返回成功读取的输入项的数量(如成功读取两个整数则返回 2),如果遇到输入错误或到达文件末尾,scanf 会返回 EOF(通常为 -1)。while (~scanf("%d%d", &a, &b)) 这行代码的意思是对 scanf 的返回值进行按位取反,然后将结果用于 while 循环的条件判断。
2.当对 scanf 的返回值使用 ~ 时,如果 scanf 成功读取了输入项,返回值将不为 0,而取反后的结果通常为一个负数;如果 scanf 返回 -1(即 EOF),则 ~(-1) 将得到 0,这时循环会停止。
3.C++ 代码中面对大量数据的读取、输出操作时,最好用scanf 和 printf,而不是cin和cout。因为scanf和printf耗时会小很多
4.区间和问题是许多编程竞赛和算法面试中常见的题型,掌握这些问题的高效解法对提升算法和数据结构的能力非常重要。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue3项目创建及相关配置
  • C++ primer plus 第17 章 输入、输出和文件:文件输入和输出02:流状态检查和is_open():打开多个文件:命令行处理技术
  • Python配置镜像
  • 【代理模式AOP】2. @Aspect的代码实战(比较Cglib和动态JDK)
  • 【STM32】USART串口和I2C通信
  • 【Canvas与艺术】黄色立体感放射光芒五角星
  • MATLAB优化模型(3)
  • Python新手错误集锦(PyCharm)
  • Django学习-数据迁移与数据导入导出
  • BIMRender渲染器插件上线 |一款免费的模型实时渲染插件
  • AI在医学领域:使用眼底图像和基线屈光数据来定量预测近视
  • 浅谈面向数据报的协议-UDP协议
  • 一文带你快速了解——LVS负载均衡集群
  • [Unity]在场景中随机生成不同位置且不重叠的物体
  • C#-了解ORM框架SqlSugar并巧妙使用(附相关数据库工具)
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • JavaWeb(学习笔记二)
  • Java比较器对数组,集合排序
  • Java多线程(4):使用线程池执行定时任务
  • Mocha测试初探
  • mysql外键的使用
  • PV统计优化设计
  • Python3爬取英雄联盟英雄皮肤大图
  • Python语法速览与机器学习开发环境搭建
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • spring-boot List转Page
  • VUE es6技巧写法(持续更新中~~~)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 编写高质量JavaScript代码之并发
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 当SetTimeout遇到了字符串
  • 动态规划入门(以爬楼梯为例)
  • 聚类分析——Kmeans
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • -- 数据结构 顺序表 --Java
  • 微服务核心架构梳理
  • 无服务器化是企业 IT 架构的未来吗?
  • #include<初见C语言之指针(5)>
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (12)Hive调优——count distinct去重优化
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (java)关于Thread的挂起和恢复
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)Unity3DUnity3D在android下调试
  • (转)winform之ListView
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET NPOI导出Excel详解