一命通关差分


 本章节是前缀和的延申

 

一命通关前缀和-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_74260823/article/details/136530291?spm=1001.2014.3001.5501

 一命通关前缀和


公交车

引入

还是利用我们在前缀和中所采用的例子——公交车。

有一辆公交车,一共上下了N批乘客:

  1. 第一批2个人,第一站上车,第五站下车
  2. 第二批6个人,第三站上车,第六站下车
  3. 第三批4个人,第二站上车,第五站下车
  4. ... 

问,在不查公交车监控的情况下,公交车到达每一站的时候车上还剩下几个人?

这个问题,传统的解决方法很直接,我们创建一个数组

vector<int> platform(k),k为数组大小车站的数目

用来表示每一站的时候,车上还剩几个人。

而对每一批上下车的乘客,假设他们有people个人在第up站上车,在第off站下车,他们在车上的站数为[up,off),也就是说,数组i到j中的所有元素都要加上他们的人数people

 用以上方法,来表示前三批人:

假设有N批人,公交车一共有k站,每一批人都是第一站上最后一站下,那最坏的时间复杂度是多少?O(Nk)。有没有办法把这个解法优化一下,让每一批人的计算都变成O(1)呢?当然有:

优化

我们想让每一批人的计算都变成O(1),那就想办法,最大化利用第up站上和第off站下的信息。我们有没有办法,只需要表示第i站和第j站的人数变化,就能表示所有站的人数变化?

如果你有办法,就不会继续看这篇文章了。直接说结论吧:当然有。我们来重新挖掘一下这个信息:

  • 第up站上people人,表示公交车上从第up站开始,往后都多了people个人
  • 第off站下people人,表示公交车上从第off站开始,往后都少了people个人
  • 而在off站之后,多people个人和少people个人加在一起,最终是0个人,也就是第up站上第off站下,只对[up,off)这些站台会产生影响,对其他站台产生不了任何影响,从而得到了我们的传统解法。

我们利用这个信息,再创立一个数组:

vector<int> dif(k)

用来表示每一站和前一站的人数差dif[i]=platform[i]-platform[i-1]

而再来通过这个数组去整理题目的信息:

  • 第二站上了四个人,也就是从第二站开始,比第二站之前都要多出四个人,自然第二站比第一站要多四个人,dif[2]+=4
  • 第三站和第二站,都比第一站多四个人,第二站和第三站的差没有变化,故dif[3]不变
  • 第五站下了四个人,也就是从第五站开始,比第五站之前都要少四个人,自然第五站比第四战要少四个人,dif[5]-=4 
  • 同理,第六站和第五站的差也没有发生变化,故dif[6]不变 

通过这个,我们自然可以总结出规律:

这样,每一批的上下车,时间复杂度都优化为了O(1)

但是,有人可能就要问了,海老师海老师,这个数组有什么用啊?这又不是最终的答案
别急,往后有反转

求解 

假设,公交车有一个第0站,第0站的人数肯定是0人

  • 我们知道了第1站和第0站的人数差,第一站的人数很容易求出来platform[1]=platform[0]+dif[1] 
  • 而接着往后,第二站和第一站的人数差我们也知道,自然platform[2]=platform[1]+dif[2] 
  • 很容易便找到规律:对于每一站i,都可以求得
    platform[i]=platform[i-1]+dif[i] 

而把所有的platform展开,就能得到:
platform[i]=platform[0]+dif[1]+dif[2]+...+dif[i]\displaystyle 

也就是,platform的值为dif数组i之前所有元素的和

好了,跳出公交车。我们通过这个解答,发现platform就是前缀和数组,而对前缀和数组的每一项求差得到的dif数组,我们称之为差分数组。我们发现了platform[i]=platform[i-1]+dif[i]
platform[i]-platform[i-1]=nums[i]

也就是,dif[i]和nums[i]其实是一回事,这就是我们常说的

好了,知道这句话其实卵用没有,我们直接来看代码吧。

代码及公式

//假设一个数组 vector<int> people中有三个元素[up,off,people]
//现在给了一个二元数组 vector<vector<int>> nums,大小为n,表示有N批乘客
//求解每一站的乘客人数//自然,初始化两个数组,platform和dif
vector<int> platform(n+1);//因为假定了一个第0站,所以多开一块空间
vector<int> dif(n+1);//差分数组for(auto& e:nums)
{int up=e[0];int off=e[1];int people=e[2];dif[up]+=people;dif[off]-=people;//每一次都是O(1),一共有n次,时间复杂度为O(n)
}//再来求前缀和
for(int i=1;i<k+1;i++)platform[i]=platform[i-1]+dif[i];
//时间复杂度为站台数量O(k)
//总的时间复杂度为O(n+k)

这类题目的特征在于,每一次操作都对一块区间内的所有元素进行同样的操作。
面对这样的问题,我们先用差分数组,来把这些同样的操作,只表示出其区间首尾的变化
然后对差分数组求出前缀和,就能表示出总的变化

这便是差分数组的公式。

好了,有了这个公式,去乱杀差分的题目吧:

1109. 航班预订统计 - 力扣(LeetCode)

2251. 花期内花的数目 - 力扣(LeetCode)


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

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

相关文章

【Vue3】源码解析-Runtime

文章目录 系列文章packages/runtime-dom/src/index.ts初始化创建renderermount \src\runtime-core\component.jsh.tspackages/runtime-core/src/renderer.ts挂载及卸载DOM节点render packages/runtime-dom/src/nodeOps.tspackages/runtime-core/src/apiCreateApp.ts创建appmoun…

前端UNIAPP端webview嵌入H5使用说明文档

一、关闭webView窗口 plus.webview.close( id_wvobj, aniClose, duration, extras ); 功能说明 关闭已经打开的Webview窗口&#xff0c;需先获取窗口对象或窗口id&#xff0c;并可指定关闭窗口的动画及动画持续时间。 参数说明 参数是否必须参数类型/固定值说明id_wvobj是…

GPT-3后的下一步:大型语言模型的未来方向

摘要&#xff1a; 本文将概述GPT-3后的下一步&#xff1a;大型语言模型的未来方向&#xff0c;包括技术发展趋势、应用场景、挑战与机遇。 引言&#xff1a; GPT-3是OpenAI于2020年发布的一款大型语言模型&#xff0c;它在自然语言处理领域取得了突破性进展。GPT-3的出现标志…

全国农产品价格分析预测可视化系统设计与实现

全国农产品价格分析预测可视化系统设计与实现 【摘要】在当今信息化社会&#xff0c;数据的可视化已成为决策和分析的重要工具。尤其是在农业领域&#xff0c;了解和预测农产品价格趋势对于农民、政府和相关企业都至关重要。为了满足这一需求&#xff0c;设计并实现了全国农产…

RabbitMQ 面试题及答案整理,最新面试题

RabbitMQ的核心组件有哪些&#xff1f; RabbitMQ的核心组件包括&#xff1a; 1、生产者&#xff08;Producer&#xff09;&#xff1a; 生产者是发送消息到RabbitMQ的应用程序。 2、消费者&#xff08;Consumer&#xff09;&#xff1a; 消费者是接收RabbitMQ消息的应用程序…

哥斯拉流量webshell分析-->ASP/PHP

哥斯拉流量webshell分析 哥斯拉是继菜刀、蚁剑、冰蝎之后的又一个webshell利器&#xff0c;这里就不过多介绍了。 哥斯拉GitHub地址&#xff1a;https://github.com/BeichenDream/Godzilla 很多一线师傅不太了解其中的加解密手法&#xff0c;无法进行解密&#xff0c;这篇文章…

Vue.js基础

表单输入绑定 基础用法 v-model 指令在表单 <input>、<textarea>及 <select> 元素上创建双向数据绑定。 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据&#xff0c;并对一些极端场景进行一些特殊处理。 vue 模板语法包括两大类 插值语法…

Java算法之数论基础

Java算法之数论基础 一、最大公约数&#xff08;Greatest Common Divisor, GCD&#xff09; 在Java中&#xff0c;我们可以使用欧几里得算法&#xff08;辗转相除法&#xff09;来求两个数的最大公约数&#xff1a; 辗转相除法&#xff08;欧几里得算法&#xff09; 辗转相…

会议室预约系统优化(蓝桥杯)

文章目录 会议室预约系统优化问题描述差分 会议室预约系统优化 问题描述 假设你是一家大型企业的 IT 工程师&#xff0c;企业内有 n 个会议室&#xff0c;每天都有多个部门预约会议室进行会议。你的任务是优化现有的会议室预约系统。 你需要设计一个程序来支持以下两种操作…

Web3社交项目UXLINK零撸教程

简介&#xff1a;UXLINK是Web3行业中首个主打双向、熟人社交关系的产品&#xff0c;与其他社交基础设施类项目相比&#xff0c;类似Twitter Vs Facebook、微博 Vs 微信的社交结构区别。UXLINK的愿景&#xff1a;1、社交中心&#xff1a;成为最大的社交平台&#xff0c;专注于真…

goctl-swagger 生成json接口文件

参考&#xff1a; GitHub - dyntrait/goctl-swagger: 通过 api 文件生成 swagger 文档 GitHub - Bluettipower/goctl-swagger 一:编译 执行go install 前一般需要设置环境&#xff0c;不然资源经常会下载不下载 go env -w GOPROXYhttps://goproxy.cn,direct 执行完 go in…

C++/CLI学习笔记4(快速打通c++与c#相互调用的桥梁)

3.4声明多个变量 同一个语句可声明同类型的多个变量&#xff0c;用逗号分隔即可&#xff0c;如下所示:int x 10, y, z 11; 该语句声明int变量x,y和z。第一个初始化为10&#xff0c;第二个未初始化&#xff0c;第三个初始化为11。 3.5变量赋值 使用赋值操作符(等号)向变量…

IO流(主要是记住四大类InputStream,OutputStream、Reader和Writer,其他都是他们的子类)

IO流 1、文件 &#xff08;1&#xff09;文件概念 文件就是保存数据的地方。例如word文档&#xff0c;txt文件&#xff0c;execl文件等等。 &#xff08;2&#xff09;文件流 文件在程序中是以流的形式来操作的。 流&#xff1a;数据在数据源&#xff08;文件&#xff09;…

【Python】Python中的正则表达式

Python中的正则表达式 1.re模块使用入门 1.1 re.match 函数 函数定义&#xff1a; re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match() 就返回 none。 函数语法&#xff1a; re.match(pattern, string, flags0) …

ASR语音识别纠错-fast correct

1、使用方式说明 ASR对应的文本越长&#xff0c;识别准确率和召回率越高 识别的错误分类&#xff1a; 编号错误类型示例1谐音字词配副眼睛-配副眼镜2混淆音字词流浪织女-牛郎织女3多字错误关关机-关机4少字错误 爱有天意-假如爱有天意 5形似字错误高梁-高粱6中文拼音全拼xin…

二叉树【Java】

二叉树遍历 前序遍历 中序遍历 后续遍历 代码 前 中 后序遍历 package Trww;public class TreeTraversal {/*12 34 5 6*/public static void main(String[] args) {TreeNode tree new TreeNode(new TreeNode(new TreeNode(4),2,null),1,new TreeNode(new TreeNode(5),3,n…

Lua使用三目运算符取值

按照三目运算符的规则&#xff0c;lua的三目运算符可以写成&#xff1a;a and b or c b为false时&#xff0c;三目运算符是无效的。 提示&#xff1a;0在lua里也是真&#xff0c;condition and 0 or 1 这句代码没问题 如果你确认b为真&#xff0c;那么就用a and b or c&…

maven私服搭建详细教程

1、为什么需要私服 如果在公司中多个项目模块中的的公共类用的都是一样的&#xff0c;那么不可能将这些一样的代码写两遍。所以将其中一个项目中的代码打包成私服&#xff0c;然后在另外一个模块中去进行引用。 除此之外&#xff0c;如果大公司中开发人员较多&#xff0c;大家同…

什么是多模态学习?

1、定义与概念 多模态学习是一种机器学习方法&#xff0c;它利用多种不同的数据模态来训练模型&#xff0c;这些模态可能包括文本、图像、音频、视频等。多模态AI技术融合了多种数据模式&#xff0c;如文本、图片、视频和音频&#xff0c;以提供对场景的更透彻理解。这种技术的…

《ElementPlus 与 ElementUI 差异集合》icon 图标使用(包含:el-button,el-input和el-dropdown 差异对比)

安装 注意 ElementPlus 的 Icon 图标 要额外安装插件 element-plus/icons-vue. npm install element-plus/icons-vue注册 全局注册 定义一个文件 element-icon.js &#xff0c;注意代码第 6 行。加上了前缀 ElIcon &#xff0c;避免组件命名重复&#xff0c;且易于理解为 e…