前缀和

输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。

所用方法和基本原理

  1. 前缀和数组的构建
    • 首先定义了一个方法getPrefixSum来构建前缀和数组。前缀和数组s的作用是记录原数组arr从起始位置到当前位置的所有元素之和。
    • 初始化s[0] = 0,这是因为前缀和从数组的起始位置开始累加,起始位置之前没有元素,和为0。
    • 通过遍历原数组arr,从索引1开始,计算s[m] = s[m - 1] + arr[m],即当前位置的前缀和等于前一个位置的前缀和加上当前位置的数组元素。这样,前缀和数组s中的每个元素s[i]都表示原数组arr中从arr[0]arr[i]的所有元素之和。
  2. 区间和的计算
    • 对于每个询问的区间[l, r],通过已经构建好的前缀和数组s来计算区间和。公式为s[r] - s[l] + arr[l]
    • s[r]表示从原数组起始位置到位置r的所有元素之和,s[l]表示从原数组起始位置到位置l - 1的所有元素之和(因为前缀和数组的索引从0开始)。所以s[r] - s[l]得到的是从arr[l + 1]arr[r]的和,再加上arr[l],就得到了从arr[l]arr[r]的和。

代码及注释

import java.util.Scanner;public class RangeSumQuery {// 构建前缀和数组public static int[] getPrefixSum(int[] arr) {int[] s = new int[arr.length];s[0] = 0;for (int m = 1; m < arr.length; m++) {s[m] = s[m - 1] + arr[m];}return s;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = sc.nextInt();}int m = sc.nextInt();// 获取前缀和数组int[] s = getPrefixSum(arr);for (int i = 0; i < m; i++) {int l = sc.nextInt();int r = sc.nextInt();// 计算并输出区间和int res = s[r] - s[l] + arr[l];System.out.println(res);}sc.close();}
}

举例说明

假设原整数序列为arr = [1, 3, 5, 7, 9],有3个询问,分别为(1, 3)(0, 2)(2, 4)

  1. 构建前缀和数组
    • s[0] = 0
    • s[1] = s[0] + arr[1] = 0 + 3 = 3
    • s[2] = s[1] + arr[2] = 3 + 5 = 8
    • s[3] = s[2] + arr[3] = 8 + 7 = 15
    • s[4] = s[3] + arr[4] = 15 + 9 = 24。所以前缀和数组s = [0, 3, 8, 15, 24]
  2. 计算询问的区间和
    • 对于询问(1, 3)
      • l = 1r = 3res = s[3] - s[1] + arr[1] = 15 - 3 + 3 = 15
    • 对于询问(0, 2)
      • l = 0r = 2res = s[2] - s[0] + arr[0] = 8 - 0 + 1 = 9
    • 对于询问(2, 4)
      • l = 2r = 4res = s[4] - s[2] + arr[2] = 24 - 8 + 5 = 21

方法的优劣

  1. 时间复杂度
    • 预处理阶段:构建前缀和数组的时间复杂度为 O ( n ) O(n) O(n),其中 n n n是原数组的长度,因为需要遍历原数组一次。
    • 查询阶段:对于 m m m个查询,每个查询的时间复杂度为 O ( 1 ) O(1) O(1),因为只需要进行简单的数组访问和加减法运算。所以总的时间复杂度为 O ( n + m ) O(n + m) O(n+m)。相比每次查询都遍历区间内所有元素的暴力解法(时间复杂度为 O ( m × n ) O(m \times n) O(m×n)),当前方法在处理多个查询时效率有显著提升。
  2. 空间复杂度
    • 需要额外的空间来存储前缀和数组,空间复杂度为 O ( n ) O(n) O(n),因为前缀和数组的长度与原数组长度相同。

优点

  • 对于多次查询区间和的场景,效率较高,大大降低了时间复杂度。
  • 实现相对简单,容易理解和编码。

缺点

  • 需要额外的空间来存储前缀和数组,如果原数组非常大,可能会占用较多内存。
  • 当原数组频繁变动时,每次变动后都需要重新计算前缀和数组,维护成本较高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89240.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89240.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89240.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BP神经网络支持向量机实现风机故障诊断

BP神经网络&#xff0c;支持向量机等用于风机故障诊断 BP神经网络&#xff0c;支持向量机等用于风机故障诊断/成功算法/bp20111202_FDD.m , 1580 BP神经网络&#xff0c;支持向量机等用于风机故障诊断/成功算法/BP_FDD.m , 6044 BP神经网络&#xff0c;支持向量机等用于风机故…

c++ std::initializer_list

测试代码&#xff1a; int sum(std::initializer_list<int> params) { // 传递若干同类型参数int total 0;for (auto num : params) {total num;}return total; }void testInitializer_list() {// 自定义类支持列表初始化class Demo {public:Demo(std::initializer_li…

Python 数据分析与机器学习入门 (五):Matplotlib 数据可视化基础

引言&#xff1a;为何可视化至关重要&#xff1f; 俗话说&#xff0c;“一图胜千言”。在数据分析领域&#xff0c;这句话尤其正确。原始的数据表格和统计摘要虽然精确&#xff0c;但往往难以揭示数据中隐藏的模式、趋势、异常值和关系。数据可视化通过将数据转换成图形&#…

AI基础1--线性代数(TODO)

1 前言 关于矩阵的运算&#xff0c;其实之前写过一篇&#xff1a;算法矩阵提速原理_矩阵分块计算速度会更快嘛-CSDN博客 还是那句话&#xff0c;计算机懂个毛的高等数学。只是矩阵运算的并行性和结构化特点与 SIMD/GPU 的执行模型非常一致。在实际硬件实现中&#xff0c;许多矩…

如何让宿主机完全看不到Wi-Fi?虚拟机独立联网隐匿上网实战!

“如何让宿主机完全看不到Wi-Fi&#xff1f;虚拟机独立联网隐匿上网实战&#xff01;” 一、前言 在某些特定环境&#xff08;如企业办公或信息安全测试&#xff09;中&#xff0c;我们可能有这样的需求&#xff1a; 让宿主机无法识别或使用某个USB网络设备&#xff0c;但虚拟…

Excel基础操作知识笔记

​ 学习视频链接&#xff1a; ​​​​​​【公开课】Excel基础大全&#xff08;1-66集&#xff09;【超高清版】_哔哩哔哩_bilibili 深圳则秀教育官方账号的个人空间-深圳则秀教育官方账号个人主页-哔哩哔哩视频 Excel技巧零基础入门公开课小白&#xff08;Excel表格制作|Exc…

【2025/06/30】GitHub 今日热门项目

GitHub 今日热门项目 &#x1f680; 每日精选优质开源项目 | 发现优质开源项目&#xff0c;跟上技术发展趋势 &#x1f4cb; 报告概览 &#x1f4ca; 统计项&#x1f4c8; 数值&#x1f4dd; 说明&#x1f4c5; 报告日期2025-06-30 (周一)GitHub Trending 每日快照&#x1f55…

Oracle 进阶语法实战:从多维分析到数据清洗的深度应用​(第四课)

在《Oracle 树形统计再进阶》(第三课)基础上&#xff0c;我们跳出传统 SQL 聚合框架&#xff0c;探索Oracle 特有的高级语法特性&#xff0c;包括多维分析神器MODEL子句、数据清洗利器正则表达式、PL/SQL 存储过程优化&#xff0c;以及基于执行计划的查询调优技巧。这些技术能解…

SpringBoot -- 自动配置原理

SpringBoot 自动配置原理 基础知识 Bean扫描 我们在学习 Spring 的时候&#xff0c;如果要把标注一下注解的类扫描进 IOC 容器 Controller&#xff0c;Service&#xff0c;Mapper&#xff0c;是需要通过一下两种方式实现的&#xff0c;但是我们在 SpringBoot 工程中并没有编写…

Kubernetes从入门到精通-服务发现Service

一、为什么需要 Service&#xff1f; Pod 的动态性&#xff1a; Pod 是 Kubernetes 调度的基本单位。它们可能因为故障、滚动更新、扩缩容等原因随时被创建或销毁。 Pod IP 的不稳定性&#xff1a; 每个 Pod 都有自己的 IP 地址&#xff0c;但当 Pod 重建时&#xff0c;IP 地址…

Milvus 资源调度系统的核心部分:「查询节点」「资源组」「数据库」

Milvus 的资源管理分为三层&#xff1a;查询节点、资源组和 数据库。 查询节点&#xff1a;处理查询任务的组件。它在物理机或容器&#xff08;如 Kubernetes 中的 pod&#xff09;上运行。 资源组&#xff1a;查询节点的集合&#xff0c;充当逻辑组件&#xff08;数据库和 C…

我的第一个开源项目:用Python搭建轻量级静态网页服务器—— 零基础也能实现的Web开发初体验

一、为什么选择静态服务器&#xff1f; 极简高效&#xff1a;无需数据库或复杂后端逻辑&#xff0c;适合展示简历、作品集等静态内容 学习曲线平缓&#xff1a;是理解HTTP协议和Web服务原理的最佳入门方式 资源消耗低&#xff1a;单文件Python脚本即可运行&#xff0c;内存占…

github 图床使用免费CDN加速(jsdelivr)

github做图床大部分人都知道&#xff0c;但是国内访问速度不稳定&#xff0c;所以使用jsdelivr加速。 jsdelivr是什么呢&#xff1f;它是一个免费、快速和可信赖的CDN加速服务&#xff0c;直接集成在github中的&#xff0c;无需额外操作即可使用。 本文分两部份&#xff0c;最…

lte高阶调制和AMC

文章目录 LTE高阶调制AMC LTE高阶调制 首先什么是调制?调制是把通信系统中的基带信号&#xff08;低频&#xff09;转化成适合信道传输的高频信号的过程。 波长&#xff08;λ&#xff09;与频率&#xff08;f&#xff09; 基本关系&#xff1a; λc/f&#xff0c;λc/f&…

shardingsphere5.2.1与SpringBoot3.X的版本冲突问题

1.先说一下我的版本配置与遇到的问题 问题产生的依赖和版本&#xff1a; 主要依赖依赖版本jdk17SpringBoot 3.3.13shardingsphere-jdbc 5.2.1 问题产生的原因&#xff1a; 主要就是shardingsphere-jdbc 与SpringBoot版本冲突&#xff0c;因为Spring Boot 需要 SnakeYAML 库来解…

FPGA控制88E1512 PHY芯片完成网络通信

一、88E1512分析 本文不对88E1512进行详细解析&#xff0c;仅对调试过程中重点使用的几个寄存器进行说明。 1.1 MDIO时序分析 根据手册&#xff0c;MDIO时序中&#xff0c;mdc时钟最高为12Mhz。占空比和建立保持时间要求可以观察上述表格。 MDIO的读数据时序图如下&#xff1a…

Ai大模型 - ocr图像识别形成结构化数据(pp-ocr+nlp结合) 以及训练微调实现方案(初稿)

全局目录,一步到位 功能流程第一阶段 基于现有条件进行 调研,测试与评估1.1 ocr深度学习模型 pp-ocr1.2 nlp结构化模型1.3 硬件要求: 第二阶段 模型训练微调2.1 更换ocr-GPU模型, 下载相关环境2.2 nlp模型 语义训练2.3 最低硬件要求:2.4 样本数据: (重点)2.5 进一步增强模型能力…

【Linux】软硬链接,动静态库

目录 一、认识一下常用指令 1、建立一个软链接 2、建立一个硬链接 3、删除文件的第二种方式&#xff1a;删除链接unlink指令 二、什么是硬链接&#xff1f; 三、软硬链接的原理&#xff1a; 四、应用场景 1、建立一个软链接可以快速在一个比较深的路径中找到目标文件进行…

VRR(可变刷新率)和QMS(快速媒体切换)

&#x1f527; 一、技术原理的本质区别 技术VRR (可变刷新率)QMS (快速媒体切换)核心目标消除动态帧率波动导致的画面撕裂/卡顿消除静态帧率切换时的黑屏中断工作机制实时调整显示器刷新率&#xff08;Hz&#xff09;匹配GPU输出帧率&#xff08;FPS&#xff09;→ 动态延长/缩…

GO 语言学习 之 Map

map 是 Go 语言中非常重要的数据结构&#xff0c;常用于需要快速查找、统计或分组数据的场景。 map定义&#xff1a; package mainimport "fmt"func main() {var m1 map[int]string // 创建一个 mapm2 : make(map[int]string) // 创建一个 map m3…