一维前缀和的实现

         这是C++算法基础-基础算法专栏的第十一篇文章,专栏详情请见此处


引入

        我们用朴素做法求一维数组的区间和时,一般是从前向后循环累加,它的时间复杂度为O(n),当求区间和的次数过多,则会有超时的可能,那有没有时间复杂度更低的做法呢?当然有,这就是前缀和做法,它求区间和的时间复杂度为O(1)

        下面我们就来讲一维前缀和的实现。

定义

        前缀和是一种重要的预处理方式,能大大降低查询的时间复杂度。

过程

        表示

        对于原数组a,一维前缀和额外开辟了一个数组b,对于每个b\left [ i \right ],储存了a\left [ i \right ]-a\left [ i-1 \right ],也就是说,s_{x}=\sum_{i=1}^{x}a_{i}

        赋值

        赋值操作一般在输入数组a时同时进行,我们可以容易得出其递推公式:s\left [ i \right ]=s\left [ i-1 \right ]+a\left [ i \right ]

        求区间和

        当我们想得到a数组区间\left [ l,r \right ]中的和,应该怎么去做呢?这里我们用图表加以理解,0表示当前位未计入总和,1表示当前位计入总和(后图同理)。

        首先,图一展示了起始状态,然后,我们将s\left [ r \right ]计入总和(图二),也就是计算了a\left [ 1 \right ]\sim a\left [ r \right ]的和,但我们并不需要a\left [ l \right ]之前的数计入总和,所以最后将s\left [ l-1 \right ]减去(图三)。

        得出结论:a\left [ l \right ]+\cdots +a\left [ r \right ]=s\left [ r \right ]-s\left [ l-1 \right ]

        代码

        下面给出一维前缀和代码:

表示:s[i]=a[1]+a[2]+...+a[i]
赋值:s[i]=s[i-1]+a[i]
求和:a[l]+...a[r]=s[r]-s[l-1]

上一篇-高精度除法的实现    C++算法基础专栏文章    下一篇-二维前缀和的实现


每周六更新一篇文章,内容一般是自己总结的经验或是在其他网站上整理的优质内容

点个赞,关注一下呗~

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

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

相关文章

算法设计练笔

T1、给定由n个整数&#xff08;可能为负数&#xff09;组成的序列a1,a2,...,an&#xff0c;求该序列子段和的最大值。当所有整数均为负数时&#xff0c;其最大子段和为0。 【输入】 第一行一个整数&#xff0c;表示n的值, 1<n<100; 第二行n个整数&#xff0c;表示a1,a2,.…

【Unity URP】通过代码动态添加URP渲染通道RendererFeature

URP的渲染通道RendererFeature可以很方便的实现一些渲染问题,比如渲染顺序问题,遮挡后的材质替换等等。 那么我们如何通过代码来动态添加和修改呢? 首先我们需要获取到当前的URP配置文件,在对配置文件进行添加 1.通过反射获取当前UniversalRendererData 我们通过Graphic…

中国移动中国联通中国电信数字化转型营销销售讲师培训老师讲授AIGC大模型人工智能5G云算力网络云网终端AIGC人工智能宽带政企物联网专线 IDC智慧城市

唐兴通 数字化商业创新顾问、新媒体营销专家、数字化销售增长教练、沃顿商学院演讲嘉宾。全球创新增长战略大家EM罗杰斯&#xff08;创新的扩散&#xff09;、杰弗里摩尔&#xff08;跨越鸿沟&#xff09;、亨利切萨布鲁夫&#xff08;开放式创新&#xff09;在中国合作者。《…

gitee代码初次上传步骤

ps. 前提是已经下载安装gitee 一、在本地项目目录下空白处右击&#xff0c;选择“Git Bash Here” 二、初始化 git init 三、添加、提交代码&#xff08;注意add与点之间的空格&#xff09; git add . git commit -m 添加注释 四、连接、推送到gitee仓库 git remote add …

Java——IO流(二)-(4/7):不同编码读取乱码的问题,转换流-InputStreamReader、OutputStreamWriter

目录 不同编码读取出现乱码的问题 转换流 InputStreamReader(字符输入转换流) 实例演示(1) OutputStreamWriter(字符输出转换流) 实例演示(2) 不同编码读取出现乱码的问题 如果代码编码和被读取的文本文件的编码是一致的&#xff0c;使用字符流读取文本文件时不会出现乱…

【Mac】adobe CameraRaw 16 for mac(ps插件RAW处理工具)软件介绍

软件介绍 Adobe Camera Raw是一款专为处理和编辑数字照片原始文件&#xff08;RAW文件&#xff09;而设计的插件&#xff0c;它提供了丰富的功能来调整和优化图像。以下是它的主要特点和功能&#xff1a; 支持广泛的RAW格式&#xff1a; Adobe Camera Raw 16 支持处理来自各…

推出新的C2000™ F28P65x 实时微控制器,专为高效控制电力电子产品而构建(F28P650DH、F28P650DK、F28P650SH)

C2000™ F28P65x 实时微控制器是集中级性能、PWM 和模拟创新与系统成本优化等优势于一身。 F28P65x 系列是 C2000™ 实时微控制器 (MCU) 系列的中级性能系列产品&#xff0c;专为高效控制电力电子产品而构建。凭借超低延迟&#xff0c;F28P65x 通过更多的模拟功能和新的 PWM 功…

关于Unity粒子(2D序列帧粒子)的旋转、StartRotation值用脚本怎么动态设置

今天要用粒子做一个拖尾效果。由于对象的移动可以向任何方向&#xff0c;所以作为拖尾的粒子要根据方向做相应的旋转。 1.没有旋转的情况&#xff08;物体向下移动&#xff09;时&#xff0c;默认是下面这样的。 粒子发射器的形状是一个向上的长方形&#xff0c;粒子的移动方向…

基于LabVIEW的设备安装螺栓连接设计

介绍了一种基于LabVIEW的辅助设备安装螺栓连接设计案例。通过LabVIEW软件&#xff0c;实现了从螺栓规格预估、强度校核到物料选用的整个流程的软件化&#xff0c;提高了设计效率和安装可靠性。 项目背景 在轨道车辆设备安装中&#xff0c;螺栓连接作为一种常见的紧固方式&…

Python制作动态颜色变换:颜色渐变动效

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame颜色变换函数主循环 完整代码 引言 颜色渐变动画是一种视觉上非常吸引人的效果&#xff0c;常用于网页设计和图形应用中。在这篇博客中&#xff0c;我们将使用Python创建一个动态颜色变换的动画效果。通…

大学教师门诊预约小程序-计算机毕业设计源码73068

摘要 在当今数字化、信息化的浪潮中&#xff0c;大学校园的服务管理正朝着智能化、便捷化的方向迈进。为了优化大学教师的医疗体验&#xff0c;提升门诊预约的效率和便捷性&#xff0c;我们基于Spring Boot框架设计并实现了一款大学教师门诊预约小程序。该小程序不仅提供了传统…

数据集归一化处理

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

8分钟带你快速了解Connector/Catalog API的核心设计

引言 在现代大数据应用中&#xff0c;数据集成和同步成为企业数据管理的关键环节。随着数据源和数据库的多样化&#xff0c;如何高效地进行数据集成成为企业面临的重要挑战。 Apache SeaTunnel 作为一款开源的数据集成工具&#xff0c;致力于解决这一问题。本文将详细介绍 Sea…

【Oracle】Oracle常用函数

目录 聚合函数数字函数1. ABS函数&#xff1a;返回一个数的绝对值。2. CEIL函数&#xff1a;返回大于等于给定数的最小整数。3. FLOOR函数&#xff1a;返回小于等于给定数的最大整数。4. ROUND函数&#xff1a;将一个数四舍五入到指定的小数位。5. MOD函数&#xff1a;返回两个…

Java 面向对象编程(OOP)的四大特征

Java 面向对象编程&#xff08;OOP&#xff09;的四大特征 1、抽象2、继承3、 封装4、多态性 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程中&#xff0c;面向对象编程&#xff08;OOP&#xff09;是一个核心概念。OOP的四大基…

总结一下 .NET FrameWork 和 .NET Core 创建的项目的不同点

前言 从 Visual Studio 2022 开始&#xff0c;微软开始淡化 .NET Framework 的概念&#xff0c;在项目向导中&#xff0c;只有使用带 “.NET Framework” 的项目模板创建的才是 .NET Framework 项目&#xff0c;使用其他模板创建的都是 .NET Core 项目 比如&#xff0c;如果你…

​智汇云舟参编的数字孪生团标在2024全球数字经济大会上发布

7月4日&#xff0c;2024全球数字经济大会元宇宙创新发展论坛&#xff0c;2024年“创客中国”元宇宙中小企业创新创业大赛颁奖活动在北京成功举办。智汇云舟作为数字孪生行业头部企业和视频孪生技术首倡者受邀出席活动&#xff0c;并与中国人民大学、摩尔线程等11家知名院校和企…

Java | Leetcode Java题解之第218题天际线问题

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> getSkyline(int[][] buildings) {PriorityQueue<int[]> pq new PriorityQueue<int[]>((a, b) -> b[1] - a[1]);List<Integer> boundaries new ArrayList&l…

算法库应用--寻找最长麦穗

学习贺利坚老师算法库 数据结构例程——串的顺序存储应用_使用顺序串存储身份证号-CSDN博客 本人详细解析博客 串的顺序存储的应用实例二_串的顺序存储应用-CSDN博客 版本更新日志 V1.0: 在原有的基础上, 进行优化名字, 并且有了相应的算法库作为支撑, 我使用了for循环来代替老…

【Linux进阶】ext2文件系统(inode)

1.再谈inode (1) 理解inode&#xff0c;要从文件储存说起。 文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做"扇区"&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&#xff09;。操作系统读取硬盘的时候&#xff0c;不会一个个…