一命通关差分


 本章节是前缀和的延申

 

一命通关前缀和-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://xiahunao.cn/news/2868449.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

关于数据文件上传到服务器的格式及上传实现的方法

文件上传的格式&#xff1a; 第一种&#xff1a;form-data格式的&#xff1a; let fm new FormData; fm.append(file,file) fm.append(filename, ) // 在请求体中进行添加请求头的信息 axios.post(https://127.0.0.1:8888/upload_single,fm,{ headers:{ …

【Linux】信号量和线程池

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【Linux】进程通信——共享内存消息队列信号量 目录 &#x1f449;&#x1f3fb;信号量&#x1f449;&#x1f…

Grass推出Layer 2 Data Rollup

Grass推出Layer 2 Data Rollup Grass邀请链接最新资讯 Grass邀请链接 欢迎使用我的邀请码进行注册: 邀请链接 如果你还不知道注册流程&#xff1a;详见Grass: 出售闲置带宽实现被动收入 最新资讯 简讯&#xff1a;2024年3月13日&#xff0c;Grass宣布正在建立基于Solana的La…

linux网络服务学习(1):nfs

1.什么是nfs NFS&#xff1a;网络文件系统。 *让客户端通过网络访问服务器磁盘中的数据&#xff0c;是一种在linux系统间磁盘文件共享的方法。 *nfs客户端可以把远端nfs服务器的目录挂载到本地。 *nfs服务器一般用来共享视频、图片等静态数据。一般是作为被读取的对象&…

【ArcGISPro】道路数据下载并使用

下载 下载链接: Geofabrik 下载服务器 这些数据通常 每天更新。 下载结果 arcmap用户下载工具 10.2:http://www.arcgis.com/home/item.html?id=16970017f81349548d0a9eead0ebba39 10.3:

猜一猜“爵”在古代是哪种器具?2024年3月17日蚂蚁庄园今日答案

蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&#xff0c;可以通过鸡蛋来进行爱心捐赠。其中&#…

2.3 HTML5新增的常用标签

2.3.1 HTML5新增文档结构标签 在HTML5版本之前通常直接使用<div>标签进行网页整体布局&#xff0c;常见布局包括页眉、页脚、导航菜单和正文部分。为了区分文档结构中不同的<div>内容&#xff0c;一般会为其配上不同的id名称。例如&#xff1a; <div id"h…

5个AI智能写作助手,为创作提供便利与支持

在当今信息爆炸的时代&#xff0c;写作已经成为各行各业中不可或缺的一部分。然而&#xff0c;对于许多人来说&#xff0c;写作仍然是一项具有挑战性的任务。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;AI智能写作助手的出现为我们提供了极大的便利和支持。在本文…

华为WLAN配置攻击检测功能示例

华为WLAN配置攻击检测功能示例 组网图形 图1 配置攻击检测功能组网图 配置流程组网需求配置思路配置注意事项操作步骤配置文件 配置流程 WLAN不同的特性和功能需要在不同类型的模板下进行配置和维护&#xff0c;这些模板统称为WLAN模板&#xff0c;如域管理模板、射频模板、…

如何使用ROS和easymqos快速搭建一辆语音控制导航的机器人

之前做的机器人小车基本都属于电脑或手机控制操作。目前&#xff0c;使用语音控制机器人小车运动&#xff0c;让机器人导航去指定地点&#xff0c;已经成为热门&#xff0c;并且语音识别技术已经有落地方案&#xff0c;可满足生活中的基本需要。有些语音芯片通过高算力处理器运…

llamma笔记:部署Llama2

1 申请Llama2 许可 Download Llama (meta.com) 地址似乎不能填中国 1.1 获取url 提交申请后&#xff0c;填的那个邮箱会受到一封meta发来的邮件&#xff0c;打码部分的url&#xff0c;之后会用得上 2 ubuntu/linux 端部署Llama2 2.1 git clone Llama2的github 仓库 bash g…

NFTScan 正式上线 Blast NFTScan 浏览器和 NFT API 数据服务

2024 年 3 月 15 号&#xff0c;NFTScan 团队正式对外发布了 Blast NFTScan 浏览器&#xff0c;将为 Blast 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。NFTScan 作为全球领先的 NFT 数据基础设施服务商&#xff0c;Blast 是继 Bitcoin、Ethereum、BNBChain、…

智慧能源管理系统在大学校园的应用-安科瑞 蒋静

1 背景 为贯彻落实《中共中央国务院关于完整准确全面贯彻新发展理念做好碳达峰碳中和工作的意见》和《国务院关于印发2030年前碳达峰行动方案的通知》要求&#xff0c;把绿色低碳发展纳入国民教育体系。 2 传统模式的痛点 传统项目模式下的系统方案缺乏整体的能源监测和管控…

【Linux】Shell编程【二】

目录 Shell流程控制条件测试注意事项示例[ condition ]与[[ condition ]]的区别 if条件单分支语法示例1&#xff1a;统计根分区使用率示例2&#xff1a;创建目录 双分支if条件语句语法案例1&#xff1a;备份mysql数据库案例2&#xff1a;判断apache是否启动&#xff0c;如果没有…

TinTin Web3 动态精选:以太坊坎昆升级利好 Layer2,比特币减半进入倒计时

TinTin 快讯由 TinTinLand 开发者技术社区打造&#xff0c;旨在为开发者提供最新的 Web3 新闻、市场时讯和技术更新。TinTin 快讯将以周为单位&#xff0c; 汇集当周内的行业热点并以快讯的形式排列成文。掌握一手的技术资讯和市场动态&#xff0c;将有助于 TinTinLand 社区的开…

掘根宝典之C++类型别名,关键字typedef,auto,decltype

类型别名 在C中&#xff0c;我们可以使用typedef关键字或using关键字来创建类型别名。下面是两种方式的示例&#xff1a; 使用typedef关键字创建类型别名&#xff1a; typedef int myInt; typedef float myFloat;myInt a;//等价int a; myFloat b;//等价float b; 使用using关…

《Python深度学习》阅读笔记

以下是《Python深度学习》一书中学习过程中记录的一些重要的专属名词和概念&#xff1a; 一、概念 深度学习&#xff08;Deep Learning&#xff09;&#xff1a;指使用多层神经网络进行机器学习的技术。神经网络&#xff08;Neural Network&#xff09;&#xff1a;一种模仿生…

【Algorithms 4】算法(第4版)学习笔记 18 - 4.4 最短路径

文章目录 前言参考目录学习笔记0&#xff1a;引入介绍1&#xff1a;APIs1.1&#xff1a;API&#xff1a;加权有向边1.2&#xff1a;Java 实现&#xff1a;加权有向边1.3&#xff1a;API&#xff1a;加权有向图1.4&#xff1a;Java 实现&#xff1a;加权有向图1.5&#xff1a;AP…

【C语言】分支语句(逻辑运算符与关系运算符)

文章目录 **逻辑运算符(&&、||、!)**逻辑运算符特点短路短路-逻辑与短路-逻辑或 **关系运算符&#xff08;relational expression&#xff09;**运算操作符的结合律、运算符 **选择结构/分支结构****if 语句****复合句的if语句(if...else..语句)****不良风格的程序** *…

力扣hot100:416.分割等和子集(组合/动态规划/STL问题)

组合数问题 我们思考一下&#xff0c;如果要把数组分割成两个子集&#xff0c;并且两个子集的元素和相等&#xff0c;是否等价于在数组中寻找若干个数使之和等于所有数的一半&#xff1f;是的&#xff01; 因此我们可以想到&#xff0c;两种方式&#xff1a; ①回溯的方式找到t…