前缀和(一维)

这篇具有很好参考价值的文章主要介绍了前缀和(一维)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、算法描述

本篇文章我们来介绍一个简单的算法,前缀和。

什么是前缀和?

  • 前缀和是某一个序列的前n项的和,可以理解为数学上的数列的前n项和。

  • 如果 \(a\)\(s\) 分别是原数组和前缀和数组,那么应该有如下关系:

    s[1] = a[1];s[2] = a[1] + a[2];s[3] = a[1] + a[2] + a[3];

如何得到前缀和?

  • 显然如果按照上面的累加法得到前缀和数组时间复杂度较大,所以我们换一个思路。

  • \(s[i]\) 表示的是前 \(i\) 项的和,那么要求前 \(i + 1\) 项的和,即 \(s[i + 1]\) ,只需要在 \(s[i]\) 的基础上加上 \(a[i + 1]\) 即可得到 \(s[i + 1]\) 了。

  • 所以可以得到递推关系式:s[i] = s[i - 1] + a[i];

前缀和有什么作用?

  • 当我们需要查询数组某段区间 \([l, r]\) 的和时,如果从 \(l\) 遍历到 \(r\) ,那么时间复杂度为 \(O(n)\) ,这个时候就可以用到前缀和的性质了。

  • \(s[r]\) 表示数组 \(a\) 的前 \(r\)项和,要求 \([l, r]\)区间内的和,只需要减去前 \(l - 1\) 项的和,即 \(s[l - 1]\) ,这样只需要 \(O(1)\)的时间复杂度就可以获取区间 \([l, r]\) 内的和。

二、题目描述

输入一个长度为 \(n\) 的整数序列。

接下来再输入 \(m\) 个询问,每个询问输入一对 \(l,r\)

对于每个询问,输出原序列中从第 \(l\) 个数到第 \(r\) 个数的和。

输入格式

第一行包含两个整数 \(n\)\(m\)

第二行包含 \(n\) 个整数,表示整数数列。

接下来 \(m\) 行,每行包含两个整数 \(l\)\(r\),表示一个询问的区间范围。

输出格式

\(m\) 行,每行输出一个询问的结果。

数据范围

\(1≤l≤r≤n,\)
\(1≤n,m≤100000,\)
\(−1000≤数列中元素的值≤1000\)文章来源地址https://www.toymoban.com/news/detail-711114.html

输入样例:

5 3
2 1 3 6 4
1 2
1 3
2 4 

输出样例:

3
6
10 

三、题目来源

AcWing算法基础课-795.前缀和

四、源代码

#include <iostream>

using namespace std;

const int N = 100010;

int n, m;
int a[N], s[N];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)    cin >> a[i];
    for (int i = 1; i <= n; ++i)    s[i] = s[i - 1] + a[i];
    
    while (m -- )
    {
        int l, r;
        cin >> l >> r;
        
        cout << s[r] - s[l - 1] << endl;
    }
    
    return 0;
}

到了这里,关于前缀和(一维)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言数组】一维数组,二维数组详解,数组传参,变长数组,这篇文章让你更全面的认识数组。

    前言: 大家好,我是 良辰丫 💞,今天带大家全面认识一下C语言里面的 数组 ,大家是不是满怀期待呢?嘿嘿嘿,别着急,我们往下看,感受C语言数组的魅力!!!💌💌💌 要么出众,要么出局。💝 乾坤未定,💟你我皆是黑马。 保存一组成绩的数据,数据多的时候难道要

    2024年01月19日
    浏览(42)
  • 蓝桥杯一维差分 | 算法基础

    ⭐ 简单说两句 ⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! 🔒 以下内容仅对你可见~ 作者: 后端小知识 , CSDN后端领域新星创作者 |阿里云专家博主 CSDN 个

    2024年02月03日
    浏览(31)
  • class066 一维动态规划【算法】

    算法讲解066【必备】从递归入手一维动态规划 // 斐波那契数 // 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 // 该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。 // 也就是:F(0) = 0,F(1) = 1 // F(n) = F(n - 1) + F(n - 2),其中 n 1 // 给定 n ,请计算

    2024年02月04日
    浏览(27)
  • 基于GMM的一维时序数据平滑算法

    本文将介绍我们使用高斯混合模型(GMM)算法作为一维数据的平滑和去噪算法。 假设我们想要在音频记录中检测一个特定的人的声音,并获得每个声音片段的时间边界。例如,给定一小时的流,管道预测前10分钟是前景(我们感兴趣的人说话),然后接下来的20分钟是背景(其他人或

    2024年02月06日
    浏览(39)
  • 前缀和算法(类似于动态规划算法)

    前缀和:在一些特定的题里面,要先把 一段连续的数的和 先算出来,用 数组来接收 ,然后 利用这个数组 返回题目需要的答案 干讲无力 题目解释更好 请往下看 题目:题目链接 题目解析: 在数组中找到一个下标,划分为2个区间 左区间的和=右区间的和,如果没有这个下标则返

    2024年02月04日
    浏览(29)
  • 【算法小课堂】深入理解前缀和算法

    前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。 我们通过一个例子来理解前缀和算法的优势: www.nowcoder.com 我们可以通过暴力的解法去解决这个问题,但是这

    2024年02月08日
    浏览(30)
  • 【数据结构与算法】前缀和+哈希表算法

    关于前缀和和哈希这两个概念大家都不陌生,在之前的文章中也有过介绍:前缀和与差分算法详解 而哈希表最经典的一题莫过于 两数之和 题目链接 题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它

    2024年02月01日
    浏览(104)
  • 算法专题四:前缀和

    一维前缀和 1.输入数组长度n和查询次数q。 2.使用一个一维数组保存数据。 3.使用一个循环获取q次需要查询范围的数据。 4.遍历r-l+1次进行一个范围求和然后输出。 5.时间复杂度:O(n^2) 6.通过不了所有的测试用例。 1.输入数组长度n和查询次数q。 2.使用一个一维数组保存数据。

    2024年02月01日
    浏览(30)
  • Java前缀和算法

    通俗来讲,前缀和算法就是使用一个新数组来储存原数组中前n-1个元素的和(如果新数组的当前元素的下标为n,计算当前元素的值为原数组中从0到n-1下标数组元素的和),可能这样讲起来有点抽象,我们举一个例子对其进行说明:给定一个数组nums[],我们创建一个大小为num

    2024年02月06日
    浏览(38)
  • 前缀和算法

    题目链接:前缀和 算法思路 先预处理出来⼀个「前缀和」数组: ⽤ dp[i] 表⽰: [1, i] 区间内所有元素的和,那么 dp[i - 1] ⾥⾯存的就是 [1, i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] + arr[i] ; 使⽤前缀和数组,「快速」求出「某⼀个区间内」所有元素的

    2024年02月22日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包