首页 > 编程语言 >【进阶算法】一维数组的前缀和

【进阶算法】一维数组的前缀和

时间:2023-11-04 16:22:44浏览次数:54  
标签:一维 arr 进阶 ... int 数组 preSum 前缀

前缀和是指数组某个索引之前的所有元素的和,是一种重要的预处理手段,使用前缀和可以快速求出数组某一个区间的和。

 

示例:数组 arr = [8,1,3,-2,5,0,-3,6],输入 m 个询问,每个询问输入一对l, r。对于每个询问,要求输出原数组中从第l个数到第r个数的和。

比如,第 1 次询问,输入 [0, 2],需要输出 12;第 2 次询问,输入 [2, 5],需要输出 6;第 3 次询问,输入 [0, 6],需要输出 12。

这个问题可以很容易的通过遍历数组解决,但是每次都需要遍历数组,时间复杂度比较高。如果使用前缀和数组,可以大大提高运算效率。

 

一、前缀和数组

创建一个前缀和数组 preSum,保存原数组 arr 每个元素的前缀和,其中 preSum[0] = 0,preSum[i + 1] = arr[i] 的前缀和,也就是前缀和数组与原数组相比,下标向右偏移一位。这样,区间 [L, R] 的和就等于 preSum[R +1] - preSum[L]。原理如下:

preSum[R + 1] = arr[0] + arr[1] + arr[2] + ... + arr[L - 1] + arr[L] + arr[L + 1] + ... + arr[R - 1] + arr[R]
preSum[L] = arr[0] + arr[1] + arr[2] + ... + arr[L - 1] 
preSum[R + 1] - preSum[L] = arr[L] + arr[L + 1] + ... + arr[R - 1] + arr[R]

 

二、代码实现

// 原数组
int[] arr = {8, 1, 3, -2, 5, 0, -3, 6};
// 前缀和数组
int[] preSum = preSum(arr);

/**
 * 构造前缀和数组
 *
 * @param arr 原数组
 * @return 前缀和数组
 */
private int[] preSum(int[] arr) {
    int len = arr.length;
    int[] preSum = new int[len + 1];
    for (int i = 1; i <= len; i++) {
        preSum[i] = preSum[i - 1] + arr[i - 1];
    }
    return preSum;
}

/**
 * 获取数组闭区间 [left, right] 的累加和
 *
 * @param left  区间左边界
 * @param right 区间右边界
 * @return 数组闭区间 [left, right] 的累加和
 */
public int sumRange(int left, int right) {
    return preSum[right + 1] - preSum[left];
}

 

三、适用场景

前缀和数组适用于频繁计算静态数组的闭区间内的元素累加和。

 

练习题目:

LeetCode 303. 区域和检索 - 数组不可变

 

标签:一维,arr,进阶,...,int,数组,preSum,前缀
From: https://www.cnblogs.com/luwei0424/p/17809271.html

相关文章

  • Git 精简快速使用以及官方文档进阶总结
    ​ 安装Git忽略,自行搜索 新建项目,或者在仓库拉取项目,进入到项目目录Github给出的引导,新项目和旧项目echo"#testgit">>README.mdgitinitgitaddREADME.mdgitcommit-m"firstcommit"gitbranch-Mmaingitremoteaddoriginhttps://github.com/9sis/tes......
  • 前缀和习题汇总
    一、洛谷p1147连续自然数和题目描述对一个给定的正整数\(M\),求出所有的连续的正整数段(每一段至少有两个数),这些连续的自然数段中的全部数之和为\(M\)。例子:\(1998+1999+2000+2001+2002=10000\),所以从\(1998\)到\(2002\)的一个自然数段为\(M=10000\)的一个解。输入格......
  • 他皮任他皮,我学我的习-我的Java进阶之路!!
    他皮任他皮,我学我的习——架构师成长之路IT行业薪资高已成为大家的共识,但你知道哪个岗位薪资在IT行业中也是“高高在上”吗?先来看一项数据直观感受下!根据看准网调研的样本数据来看,架构师在全国的平均月薪为41609元,中位数为46083元,其中薪资范围在30k-38k的比例高达21%。(数据来源......
  • Vue+OpenLayers从入门到实战进阶案例汇总目录,兼容OpenLayers7和OpenLayers8
    本篇作为《Vue+OpenLayers入门教程》和《Vue+OpenLayers实战进阶案例》所有文章的二合一汇总目录,方便查找。本专栏源码是由OpenLayers结合Vue框架编写。本专栏从Vue搭建脚手架到如何引入OpenLayers依赖的每一步详细新手教程,再到通过各种入门案例和综合性的实战案例,带领大家快速......
  • 弯道超车,Android初级程序员进阶修炼手册
    前言是否有很多Android程序员已经进入了这么一种状态,感觉晋升无望,每天维护同样的模块,写的代码也很少出现bug,即使有bug也能迅速解决,当年对IT的热爱也快要消磨殆尽了。据统计,今年的毕业生将创历史新高,多达1158万。并不是说所有毕业生都会进入IT行业,但每年进入IT行业只多不少,而一直身......
  • Java-并发编程-进阶篇
    在上一篇幅中对并发编程进行了简单介绍:并发与并行,进程与线程,以及并发编程的简单代码但是在企业中往往并不能解决实际问题,例如:1.synchronized关键字在企业开发中会大大降低系统的性能2.当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象......
  • 前缀和差分
    前缀和什么是前缀和:简单来说,有一个\(x\)数组和\(y\)数组,\(y\)是\(x\)的前缀和数组。\(y_1=x_1\)\(y_2=x_1+x_2\)\(y_3=x_1+x_2+x_3\)\(y_n=x_1+x_2+x_3+……+x_n\)求区间和求前缀和的公式r[i]=r[i-1]+s[i]\(r\)为前缀和数组,要求\(x\)到\(y\)的区间和的话,那么......
  • sql语句性能进阶必须了解的知识点——索引失效分析
    在前面的文章中讲解了sql语句的优化策略https://blog.51cto.com/liwen629/8146651sql语句的优化重点还有一处,那就是——索引!好多sql语句慢的本质原因就是设置的索引失效或者根本没有建立索引!今天我们就来总结一下那些无效的索引设置方式进而避免大家踩坑!看到这里有的同学会问:what?......
  • 前缀和和差分
    一维前缀和1#include<iostream>2usingnamespacestd;34constintN=100010;5intn,m;6inta[N],s[N];//初始化s[0]=078intmain()9{10scanf("%d%d",&n,&m);11for(inti=1;i<=n;i++)cin>>......
  • [17章+电子书]C#速成指南-从入门到进阶,实战WPF与Unity3D开发
    点击下载:[17章+电子书]C#速成指南-从入门到进阶,实战WPF与Unity3D开发  提取码:a3s5 《C#速成指南--从入门到进阶,实战WPF与Unity3D开发》完整讲解了C#语言的核心知识和高阶编程技巧,并结合WPF客户管理系统和Unity3D切水果游戏两大实战项目,帮你实现技术的精通,完成从Zero到Hero的蜕变......