【算法】前缀和——前缀和

本题主要用一个模板题目来说明前缀和的基本思想,有需要借鉴即可。

目录

  • 1.题目
  • 2.前缀和
    • 2.1题目分析
    • 2.2前缀和算法
      • 第一步,先预处理一个前缀数组
      • 第二步,由题计算得结果
  • 3.代码示例
  • 4.总结

1.题目

题目链接:LINK
在这里插入图片描述

这个题目可以用暴力求解的思路来做的,只不过时间复杂度是O(N*Q)…

我们这里不谈暴力求解的思路,来介绍一种新的方法——前缀和。
我感觉前缀和方法本质上是一种用空间换时间的思路。

2.前缀和

2.1题目分析

暴力求解:题目要求我们求[l,r]区间的数字之和,我们暴力求解无非就是累加,sum = arr[l] + arr[l + 1] + … + arr[r],显然有q次求值,时间复杂度就成了O(N*Q),然后就时间复杂度太高了

暴力时间复杂度高的原因:但是暴力求解时间复杂度高的原因我们仔细想一想就不难发现,说白了就做了大量之前得出的和之后却一次一次又重新进行计算。

想法:所以我们根据以空间换时间的思想,只要把可能用到的和存一下,方便下一次用就行了。

2.2前缀和算法

第一步,先预处理一个前缀数组

比如说,题目给我们如下数组:
在这里插入图片描述
那我们可以搞一个前缀和数组,这个前缀和数组的i下标对应的值是arr数组[1,i]区间值的和。
这样直接遍历一遍arr就可以得到这个前缀和数组了:
在这里插入图片描述

第二步,由题计算得结果

题目要求我们给的是[l,r]这个区间的和,但是我们有的是[1,l-1],[1,l],[1,r]区间的和,其实我们给他做个差就能得到结果了,即:sum[l,r] = sum[1,r] - sum[1,l-1];

这个地方因为用到了l-1下标,为了防止出现0 - 1 = -1(-1下标对数组不存在)的情况,所以我们整体存值的时候把数组每个元素往前移动一个就行,把0位置空出来,0位置处置为0即可。当然,这个地方也可以做特殊判断来进行处理。

3.代码示例

#include <iostream>
using namespace std;

int main() 
{
    //读取数据
    size_t n = 0, q = 0;
    cin >> n >> q;
    long arr[n + 1];
    arr[0] = 0;
    for(size_t i = 1; i <= n; i++)
    {
        cin >> arr[i];
    }

    //创建前缀和数组
    long summary[n + 1];   
    //求前缀和
    summary[0] = 0;
    for(size_t i = 1; i <= n; i++)
    {
        summary[i] = summary[i - 1] + arr[i];
    }

    //输出结果
    while(q--)
    {
        int l, r;
        cin >> l >> r;
        cout << (summary[r] - summary[l - 1]) << endl;
    }
    
    return 0;
}

4.总结

前缀和算法本质是一种“以空间换时间”的思想,其实这个很简单,我没听老师讲这个算法的时候好像就用过这个思想做过一道差不多的题目。这个思想很简单,但是题目不好说,上面的题目仅仅是个模板题而已…

我觉得我们在处理一些题目时候就可以借鉴“以空间换时间”的这一思想,省去大量重复计算,从而提高效率。


EOF

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c 的库函数有哪些

C语言的库函数非常丰富&#xff0c;涵盖了多种功能&#xff0c;为程序员提供了大量的工具来完成各种任务。以下是一些主要的C语言库函数及其分类&#xff1a; 标准输入输出函数&#xff1a; printf()&#xff1a;用于输出格式化的数据到标准输出设备。scanf()&#xff1a;用于…

数字化农业新时代:图扑农林牧综合监控平台

利用图扑自研 HT for Web GIS 产品&#xff0c;结合遥感技术&#xff0c;构建可交互式的农林牧数据分析平台。该平台围绕地块总览、播种分析、牛只管理、设备查询四个维度&#xff0c;对地区的全貌、农场、村集体分布以及相应的环境进行多样化的可视化展示和进行数据支持&#…

网站报价明细

随着互联网的快速发展和普及&#xff0c;网站建设已经成为越来越多企事业单位必备的基础设施之一。作为企业展示形象和运营业务的重要平台&#xff0c;网站对于企业发展起着举足轻重的作用。因此&#xff0c;网站报价明细在企业进行网站建设时尤为重要。 网站报价明细是指在网站…

Java多线程(02)

一、如何终止线程 终止线程就是要让 run 方法尽快执行结束 1. 手动创建标志位 可以通过在代码中手动创建标志位的方式&#xff0c;来作为 run 方法的执行结束条件&#xff1b; public static void main(String[] args) throws InterruptedException {boolean flag true;Thr…

邦注科技三机一体除湿干燥机在工业中的应用

三机一体除湿干燥机在工业中的应用广泛且重要&#xff0c;其结合了传统除湿机、冷凝器和加热器的功能&#xff0c;具有节能、环保、方便等特点。以下是关于三机一体除湿干燥机在工业中应用的详细解析&#xff1a; 一、应用领域 电子制造行业&#xff1a;在半导体、集成电路和…

超清高帧,成像升级 | SWIR短波红外相机500万像素992芯片

博图光电5MP短波红外相机&#xff0c;搭载了索尼IMX992 SenSWIR传感器&#xff0c;支持5.2MP分辨率&#xff0c;适合探测波长在400nm-1700nm波段的可见光和短波红外光&#xff0c;有效面积和透光率得到提升&#xff0c;内置TEC制冷片&#xff0c;实现了像素尺寸和图像均匀性方面…

重学java 49 增强for

知之俞明&#xff0c;则行之越笃&#xff1b;行之愈笃&#xff0c;则知之愈益&#xff1b; —— 24.5.28 一、基本使用 1.作用: 遍历集合或者数组 2.格式: for(元素类型 变量名:要遍历的集合名或者数组名) 变量名就是代表的每一个元素 3.快捷键: 集合名或者数组名.for package …

AI大模型如何“开窍”?算法、数据与架构的三重奏

一、算法创新 1. 探索新的学习范式 自监督学习&#xff1a;利用未标注数据让模型自我学习&#xff0c;提高模型的泛化能力。元学习&#xff1a;让模型学会如何学习&#xff0c;以便在不同任务之间快速迁移。强化学习&#xff1a;通过试错与奖励机制&#xff0c;使模型在与环境…

外贸仓库管理软件:海外仓效率大幅度提升、避免劳动力积压

随着外贸业务的不断发展&#xff0c;如何高效管理外贸仓库&#xff0c;确保货物顺利流转&#xff0c;订单顺利处理&#xff0c;就变得非常重要。 现在通常的解决方案都是通过引入外贸仓库管理软件&#xff0c;也就是我们常说的海外仓WMS系统来解决。 今天我们就系统的探讨一下…

langchian进阶二:LCEL表达式,轻松进行chain的组装

LangChain表达式语言-LCEL&#xff0c;是一种声明式的方式&#xff0c;可以轻松地将链条组合在一起。 你会在这些情况下使用到LCEL表达式: 流式支持 当你用LCEL构建你的链时&#xff0c;你可以得到最佳的首次到令牌的时间(输出的第一块内容出来之前的时间)。对于一些链&#…

Rust最新版安装(v1.78.0+)

系统&#xff1a;Windows 11 专业版 23H2rustc&#xff1a;1.78.0 配置环境变量和设置配置文件 新建文件夹“C:\Rust\Rustup”和“C:\Rust\Cargo”。【以管理员身份运行】打开CMD 设置系统环境变量&#xff0c;如下设置RUSTUP_DIST_SERVER&#xff0c;其余同理 C:\Windows\S…

钡铼PLC集成BL121PO协议网关优化电子制造产线的生产效率

PLC转OPC UA协议转换网关BL121PO在电子制造产线中的优化应用&#xff0c;可以显著提高生产效率&#xff0c;促进生产线的智能化和信息化发展。本文将从以下几个方面进行阐述&#xff1a; 提高设备间通信效率&#xff1a;PLC转OPC UA协议转换网关BL121PO通过高效的协议转换&…

Keras深度学习框架第十九讲:在 KerasCV 中使用CutMix、MixUp 和 RandAugment 图像增强技术

1、绪论 1.1 图像增强的主流方法 CutMix CutMix 是一种图像增强技术&#xff0c;它通过从另一幅图像中随机裁剪一个区域并粘贴到当前图像上来创建新的训练样本。同时&#xff0c;标签也会按照两个图像中裁剪区域的比例进行混合。这种方法有助于模型学习如何处理部分遮挡的情…

VScode代码片段自动转图标

注&#xff1a;在VScode编辑器中&#xff0c;编辑html、vue等文件时&#xff0c;特定代码片段&#xff08;token/xxx’等&#xff09;自动转图标显示&#xff0c;按住“ctrl鼠标左键”还可跳转“https://icones.js.org/collections”&#xff0c;个人感觉干扰代码编写&#xff…

SD Flash介绍

作为一家专业生产存储芯片及存储卡的原厂&#xff0c;我们时常收到客户关于SD Flash的各种技术问题。MK米客方德将详细解答关于SD Flash的常见问题&#xff0c;助您更好地了解这一重要存储技术。 SD Flash是一种常见的存储卡技术&#xff0c;广泛应用于各种便携式设备中&#x…

《MySQL怎样运行的》-从一条记录说起-InnoDB记录存储结构

我们都知道MySQL是用来存储数据的&#xff0c;那你有没有的疑问&#xff0c;他是怎么存储的&#xff0c;它实际上是在使用储存引擎&#xff0c;那如果有人问你MySQL的储存引擎有哪些你该怎么说呢&#xff0c;主要是有InnoDB&#xff0c;MyISAM还有MEMORY&#xff0c;后面两种在…

webpack5基础和开发模式配置

运行环境 nodejs16 webpack基础 webpack打包输出的文件是bundle 打包就是编译组合 webpack本身功能 仅能编译js文件 开始使用 基本配置 五大核心概念 准备webpack配置文件 1.在根目录 2.命名为webpack.config.js 开发模式介绍 处理样式资源 处理css样式资源文件…

5W 1.5KVDC、3KVDC 宽电压输入 DC/DC 电源模块——TP05DA 系列,广泛应用于通信、铁路等设备中

TP05DA系列电源模块额定输出功率为5W&#xff0c;外形尺寸为31.75*20.32*10.65&#xff0c;应用于2:1及4:1电压输入范围 9V-18V、18V-36V、36V-72V、9V-36V和18V-72VDC的输入电压环境&#xff0c;输出电压精度可达1%&#xff0c;具有输出短路保护等功能&#xff0c;可广泛应用于…

导出excel带水印

需要一些前置知识(一些基本知识) 导出excel带水印:前置知识1 BufferedImage和ImageIO 导出excel带水印:前置知识2 Graphics2D用法 导出excel带水印:前置知识3 ByteArrayOutputStream 导出excel带水印:前置知识4 BigExcelWriter 导出excel带水印:前置知识5 POI包 前端代码就不贴…

产线虚拟现实vr仿真软件开发在线上能全面呈现企业品质和专业度

在数字化浪潮中&#xff0c;上海VR全景场景制作公司凭借其领先的VR全景制作技术&#xff0c;正为各行各业带来前所未有的沉浸式体验。无论是学校企业场地的生动展示&#xff0c;还是汽车内饰与外观的360度全景呈现&#xff0c;我们都能通过VR虚拟现实制作技术&#xff0c;让您的…