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

【每日一算法】一维前缀和算法 | 模板应用

💛 前情提要💛

本章节是每日一算法一维前缀和算法的相关知识~

接下来我们即将进入一个全新的空间,对代码有一个全新的视角~

以下的内容一定会让你对数据结构与算法有一个颠覆性的认识哦!!!

❗以下内容以C++的方式实现,对于数据结构与算法来说最重要的是思想哦❗

以下内容干货满满,跟上步伐吧~


作者介绍:

🎓 作者: 热爱编程不起眼的小人物🐐
🔎作者的Gitee:代码仓库
📌系列文章&专栏推荐: 《刷题特辑》、 《C语言学习专栏》、《数据结构_初阶》 、《C++轻松学_深度剖析_由0至1》、《Linux - 感受系统美学》

📒我和大家一样都是初次踏入这个美妙的“元”宇宙🌏 希望在输出知识的同时,也能与大家共同进步、无限进步🌟
🌐这里为大家推荐一款很好用的刷题网站呀👉点击跳转


📌导航小助手📌

  • 💡本章重点
  • 🍞前缀和
    • 🏷️一维前缀和【难度:简单】
  • 🫓总结


💡本章重点

  • 一维前缀和的算法理解&应用

🍞前缀和

💡前缀和算法:

  • 本质:就是计算前i个数组元素的和

  • 前缀和对于计算数组中某一段连续区间元素的和有奇效

    • 即我们无需每次计算某一段连续区间的和时都遍历一次数组

    • 我们只需要计算一次数组中每个位置对应的前缀和并把其存储起来,这样我们就能利用相减,去求出某一段区间的前缀和了

特别注意:

  • 对于计算前缀和,一般默认前缀和数组(即存放前缀和答案的数组)是从下标为1开始存放的,而下标为0处默认存放数字0

  • 这样就能有效避免边界问题,Eg:求数组中区间下标为[1,10]的元素的和,我们就可以利用前缀和数组s[10] - s[0]得出答案

👉初始化前缀和数组

//s数组为前缀和数组;s[0] = 0; a数组为原数组
for(int i = 1; i <= n; i++) s[i] = s[i-1] + a[i];

👉计算某一段区间的前缀和

a[l] + ... + a[r] = S[r] - S[l - 1]

➡️那我们就来道题目试验一下吧~


🏷️一维前缀和【难度:简单】

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

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

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

输入格式

第一行包含两个整数 n n n m m m

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

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

输出格式

m m m 行,每行输出一个询问的结果

数据范围

1 ≤ l ≤ r ≤ n 1≤l≤r≤n 1lrn

1 ≤ n , m ≤ 100000 1≤n,m≤100000 1n,m100000

− 1000 ≤ 数列中元素的值 ≤ 1000 −1000≤数列中元素的值≤1000 1000数列中元素的值1000

输入样例:

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

输出样例:

3
6
10

👉代码实现:

#include <iostream>

using namespace std;

const int N = 100010;

int a[N],b[N];

int n, m;

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

🫓总结

综上,我们基本了解了算法基础中的 “一维前缀和算法” 🍭 的知识啦~~

恭喜你的内功又双叒叕得到了提高!!!

感谢你们的阅读😆

后续还会继续更新💓,欢迎持续关注📌哟~

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨

在这里插入图片描述

相关文章:

  • Java读取HDFS上的Excel文件
  • 51驱动AS608光学指纹识别模块 12864显示
  • RK3399平台开发系列讲解(内核入门篇)1.53、platform平台设备
  • 科研必备|找国自然快速捕捉科研热点
  • 10.7.复习
  • python专区--容器详解(字典与集合)
  • Java多线程10—如何使用线程池创建线程?
  • python数据分析及可视化(七)pandas数据清洗,显性问题(异常、缺失、重复),隐形问题(离散、面元、字符串)
  • Java实现拼图小游戏(5)—— 美化界面(含源码阅读)
  • 【MySQL从入门到精通】【高级篇】(二十五)EXPLAIN中ref、rows、filtered、Extra字段的剖析
  • C语言数组详解
  • DS | 冲刺阶段考点整理 —— 绪论、线性表、栈与队列、特殊矩阵、串
  • 实验5 循环结构
  • 【漏洞复现-Apache-目录穿越文件读取-RCE】vulfocus/apache(cve_2021_41773)
  • 基于matlab的SVM支持向量机分类仿真,核函数采用RBF函数(提供matlab仿真录像)
  • 3.7、@ResponseBody 和 @RestController
  • C++入门教程(10):for 语句
  • co模块的前端实现
  • es的写入过程
  • Java到底能干嘛?
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • vue-loader 源码解析系列之 selector
  • Web设计流程优化:网页效果图设计新思路
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 初识 webpack
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 记一次删除Git记录中的大文件的过程
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端知识点整理(待续)
  • 如何设计一个比特币钱包服务
  • 如何优雅地使用 Sublime Text
  • 转载:[译] 内容加速黑科技趣谈
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​TypeScript都不会用,也敢说会前端?
  • ###C语言程序设计-----C语言学习(6)#
  • #{}和${}的区别?
  • (AngularJS)Angular 控制器之间通信初探
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (三十五)大数据实战——Superset可视化平台搭建
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)80c52学习之旅-起始篇
  • .Net IE10 _doPostBack 未定义
  • .net 发送邮件
  • .NET 依赖注入和配置系统
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • @property括号内属性讲解
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [20150629]简单的加密连接.txt