算法之前缀和和差分

一.前缀和

首先我们来看下面这道题:

假如给你一个数组从a1到an,接下来有m次询问,每次询问有两个参数l,r,请问al到ar之和,每次询问按行输出???

对于这个问题,如果你是没有这方面基础的,第一反应肯定是我们对于每个询问直接暴力遍历al到ar区间,输出结果,时间复杂度为O(N^m),但是如果我对于你的时间复杂度限制到O(N),你的操作肯定就会超时,所以接下来你该如何操作呢?

经过仔细思考的你,发现如果你们对每个位置i,统计其前面所有下标的和(包括其位置),此时如果你用ar-a(l-1)就可以在O(1)的时间应对每次询问,时间复杂度就优化到了O(n)

下面我们简单的实现其代码:

#include <bits/stdc++.h> 
using namespace std;
const int N =1e5;
int n,l,r,m;
int a[N+1];
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}//前缀和处理:for(int i=1;i<=n;i++) {a[i]=a[i-1]+a[i];//初学可以用dp[i]=dp[i-1]+a[i] }while(m--){cin>>l>>r;cout<<a[r]-a[l-1]<<"\n";}return 0;
}

我们现在知道了前缀和算法,那么我们什么时候会使用该算法呢???

对于一个算法学习这是非常重要的内容,对于一个算法的掌握唯有知道什么时候用再加上多练习使用,才能在比赛中想到使用!!!

对于该前缀和算法,我们发现如果我们想要一个数组内部从某个位置到某个位置的某种关系时,就可以使用该算法

下面我们来学习另一种算法:

二.差分:

我们长话短说,还是从一道题目看起:

现在有一个数组从a1到an,接下来有m次操作,每次操作输入两个数l,r,将al到ar区间每个数-1,现在m次操作后输出该数组???

对于该题,第一反应如果你是想到了前缀和,那么恭喜你,肯定是将前面的内容仔细阅读过的,但是现在问题是,我们直接用前缀和是无法解决该问题的,因为我们要的是整个数组,仔细思考之后,你有回到了暴力,想如果我们对于每次询问将l和r区间的内容都减少-1,时间复杂度为O(N*N)

如果还是对你作出限制,时间复杂度要求为O(N*m),请问阁下又该如何应对???

如果此时你不感到烦躁,可以试试思考下,毕竟如果你在没学过的情况下就能想到接下来的做法,我只能说声:大哥,苟富贵,莫相忘!!!

好了,回到正题!

如果我们对于al到ar区间都-1,等价于对于al到an区间都-1,然后再对a(r+1)区间+1,此时就满足题目要求,接下来我们如果用一个相同大小的数组,将bl位置-1,b(r+1)位置+1,此时如果你回想一下,如果再对b数组一次前缀和:如下操作:

定义一个dp数组:

dp[i]=dp[i-1]+b[i](注意边界处理,最好从一开始)

此时我们是不是就相当于进行了题目要求的操作,如果我们直接现在b数组上进行m次操作,在前缀和遍历一遍,是不是就可以输出该数组的结果,时间复杂度为O(N*m)

代码如下:

#include <bits/stdc++.h> 
using namespace std;
const int N =1e5;
int n,l,r,m;
int a[N+1],b[N+1],dp[N+1]; 
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}while(m--) {cin>>l>>r;b[l]++;b[r+1]--;}//注意:dp[i]表示为前i个b数组中元素处理后结果,包括i位置for(int i=1;i<=n;i++){dp[i]=dp[i-1]+b[i];}for(int i=1;i<=n;i++) {a[i]+=dp[i];}//输出; for(int i=1;i<=n;i++){cout<<a[i]<<" ";}cout<<endl;return 0;	
}

此时同样我们还是来思考下该算法的使用范围,是不是如果我们想要对数组中一段区间范围同时进行相同操作,并且重复多次该操作,然后问数组相关的解答时,该算法是非常合适的,没错,这就是该算法的使用情景。

今天我们学习了前缀和和差分,希望大家好好掌握!!!

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

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

相关文章

Vue3+TS版本Uniapp:封装uni.request请求配置

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 封装请求配置项 封装拦截器封装uni.request 封装拦截器 uniapp的封装逻辑不同于Vue3项目中直接使用axios.create()方法创建实例&#xff08;在create方法中写入请求…

【探讨】RocketMQ消息灰度方案-消息逻辑隔离

vivo 鲁班平台 RocketMQ 消息灰度方案 - 稀土掘金分布式- vivo鲁班RocketMQ平台的消息灰度方案MQ消息在生产环境和灰度环境隔离一般怎么实现?消息隔离的原则 中心正常消费者,可以同时消费正常的消息和特定标签的消息(自动识别);特定标签的消费者,只能消费特定标签的消息。灰…

内存管理下及模板初阶

嗨喽&#xff0c;今天阿鑫给大家带来内存管理下以及模板初阶的博客&#xff0c;下面让我们开始今天的学习吧&#xff01; 内存管理下及模板初阶 new和delete的实现原理定位new表达式(placement-new)常见面试题泛型编程函数模板类模板 1. new和delete的实现原理 1.1 内置类型…

Logback:www.w3.org被qiang导致logback报错:Connect reset

稳定运行的系统中&#xff0c;突然报logback不能用的错误&#xff0c;如下&#xff1a; Reported exception: ch.qos.logback.core.joran.spi.JoranException: I/O error occurred while parsing xml file at ch.qos.logback.core.joran.event.SaxEventRecorder.recordEvents(…

用全连接对手写数字识别案例(附解决TensorFlow2.x没有examples问题)

数据集介绍 数据集直接调用可能出现问题&#xff0c;建议从官网直接下载下来&#xff0c;下载存在这四个文件 手写数字识别数据集下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nqhP4yPNcqefKYs91jp9ng?pwdxe1h 提取码&#xff1a;xe1h 55000行训练数据集&a…

【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09; 文章目录 【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09;一、搭建…

判断完数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int n 0;int i 1;int j 0;int result 1;//提示用户&#xff1b;printf("请输入一个…

每天学习一个Linux命令之join

每天学习一个Linux命令之join Linux系统是广泛应用的操作系统&#xff0c;为了更加高效地使用Linux系统&#xff0c;我们每天学习一个Linux命令。今天要学习的是join命令。 1. 简介 join命令在Linux系统中用于结合两个文件的共同字段&#xff0c;并输出它们的相应行。这个命…

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…

【布客技术评论】大模型开源与闭源:原因、现状与前景

在人工智能领域&#xff0c;大模型的开源与闭源一直是一个备受争议的话题。近期&#xff0c;某大厂厂长说了“开源模型永远超不过闭源模型”&#xff0c;结果&#xff0c;脸书就发布了开源模型Llama3&#xff0c;超过了OpenAI 的闭源模型 GPT4。本文将探讨大模型开源与闭源的原…

基础SQL DDL语句

MySQL的DDL&#xff08;Data Definition Language&#xff09;语句用于定义或修改数据库结构。 DDL数据库操作 查看所有的数据库 show databases; 红色圈起来的是系统数据库&#xff0c;是系统自带的 mysql&#xff1a;包含存储MySQL服务器运行时所需信息的表。这包括数据字典…

【Linux】MySQL的安装及配置(Ubuntu-18.04)

一、安装MySQL 分别安装MySQL服务器、MySQL客户端、C/C开发库 sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install libmysqlclient-dev 二、配置MySQL 1.查看默认配置文件&#xff0c;此处的user和password为默认提供的&#xff0c;…

Ceph 分布式文件系统 搭建及使用

一、Ceph 介绍 在当今数据爆炸式增长的时代&#xff0c;企业对于可靠、可扩展的存储解决方案的需求日益迫切。Ceph 作为一种开源的、可伸缩的分布式存储解决方案&#xff0c;正逐渐成为企业级存储领域的热门选择。Ceph是一种由Radicalbit公司开发的开源分布式存储系统&#xf…

【数据结构】冒泡排序

冒泡排序是一种简单的排序算法。 它基于重复地交换相邻元素的位置。算法的每一步都会比较相邻的两个元素&#xff0c;如果它们的顺序错误&#xff08;即第一个元素比第二个元素大&#xff09;&#xff0c;则交换它们。这样&#xff0c;每经过一轮比较和交换&#xff0c;数组中…

ElasticSearch虚拟机安装(单机版)

1.下载7.10.2 下载链接&#xff0c;选择LINUX X86_64下载 2.创建用户 useradd es也可以使用系统默认用户&#xff08;非root&#xff09;,root用户会报错 3.解压 tar xvf elasticsearch-7.10.2-linux-x86_64.tar.gz假定目录在/home/es/elasticsearch-7.10.2-linux-x86_64 …

Spring Boot | Spring Boot 默认 “缓存管理“ 、Spring Boot “缓存注解“ 介绍

目录: 一、Spring Boot 默认 "缓存" 管理 :1.1 基础环境搭建① 准备数据② 创建项目③ 编写 "数据库表" 对应的 "实体类"④ 编写 "操作数据库" 的 Repository接口文件⑤ 编写 "业务操作列" Service文件⑥ 编写 "applic…

JavaCard学习笔记: CAP Component 之 Class Component

文章目录 整体结构tag和size字段signature_pool_length和signature_pooltype_descriptor结构导入类型编码导入项签名示例导入类导入数组导入远程方法 interfaces[]interface_info结构flagsinteface_countsuperinterfacesinterface_name class_info_compact classes[]结构flagsi…

稀碎从零算法笔记Day55-LeetCode:100291. 统计特殊字母的数量 II

今天可惜了&#xff0c;周赛第二题没看出来&#xff0c;导致第三题时间都不够&#xff0c;最后一题... 题目描述&#xff1a; 给你一个字符串 word。如果 word 中同时出现某个字母 c 的小写形式和大写形式&#xff0c;并且 每个 小写形式的 c 都出现在第一个大写形式的 c 之前…

基于Springboot的网上商城购物系统

基于SpringbootVue的网上商城购物系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 商品信息 商品资讯 后台登录页面 后台管理首页 用户管理 商品分类管…

JAVA 整合 亚马逊AWS S3(文件上传,文件下载等)

JAVA 整合 亚马逊AWS S3(文件上传,文件下载) 1.添加依赖 因为aws需要发送请求上传、下载等api,所以需要加上httpclient相关的依赖 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>1.12…