【队列的算法题记录】239. 滑动窗口最大值

239. 滑动窗口最大值

题目链接

思路

提到滑动窗口就不难不想到队列,这题是要获得滑动窗口每一步的最大值,所以我们可以通过保证队列的单调性(即单调递减,使得最大值永远处在队列前端)来实现:

class MyQueue {public:deque<int> que; // 用deque来实现单调队列// 如果当前value和队列前端元素相等,就让队列前端元素出列void pop(int value) {if(!que.empty() && value == que.front()) {que.pop_front();}}/* 如果当前数值比队列入口处元素大,则要将队列后端的数值弹出,直到value小于队列入口处元素(保证单调递减)*/void push(int value) {while(!que.empty() && value > que.back()) {que.pop_back();}que.push_back(value);}// 获取队列中的最大值(永远在前端)int front() {return que.front();}}

上面用deque实现了我们需要的队列操作:pop、push和front。滑动窗口向后滑动时,pop可以弹出前端元素,push是加入后面的元素,front是获取当前队列中的最大值(因为我们实现的是单调递减队列)。

那么我们具体是怎么让元素出入列同时保持单调递减的呢?

  • 当滑动窗口滑动,要加入元素到队列时,首先看当前元素value与队列最后面的元素大小,如果value比它小,则直接加入value至队尾可以保证单调递减。如果value比它大,则要先让队尾元素出去,这里用的是while循环而不是if,我们要让比value小的都出队列,保证单调性。
  • 滑动窗口滑动,加入元素,也要弹出队列前端的元素,这里我们不能直接弹出,因为队列最前端放的是最大值,而它不一定是要出队列的那一个元素,所以在进行pop时,我们首先要判断前端元素是不是我们要pop出来的那个元素。

cpp代码

class Solution {
private:class MyQueue {public:deque<int> que; // 用deque来实现单调队列// 如果当前value和队列前端元素相等,就让队列前端元素出列void pop(int value) {if(!que.empty() && value == que.front()) {que.pop_front();}}/* 如果当前数值比队列入口处元素大,则要将队列后端的数值弹出,直到value小于队列入口处元素(保证单调递减)*/void push(int value) {while(!que.empty() && value > que.back()) {que.pop_back();}que.push_back(value);}// 获取队列中的最大值(永远在前端)int front() {return que.front();}}
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {MyQueue que;vector<int> result;for(int i = 0; i < k; i++) {    // 首先将nums的前k个元素加入队列que.push(nums[i]);}result.push_back(que.front());  // 取得初始窗口的最大值(获取单调队列的前端)for(int i = k; i < nums.size(); i++) {que.pop(nums[i-k]); // 滑动窗口移除最前面的元素que.push(nums[i]);  // 滑动窗口前加入最后面的元素result.push_back(que.front());  // 记录对应的最大值}
};

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

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

相关文章

【MySQL探索之旅】多表查询

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

【数学】推荐一种用尺规绘制正五边形,简单而又精确的作法

【说明】 正五边形的尺规作图方法很多&#xff0c;但大多比较繁琐&#xff0c;下面介绍一种作法&#xff0c;这种方法步骤少&#xff0c;简便易行。 【具体步骤】 1.作相互垂直的两条直线&#xff0c;交点为O&#xff1b; 2.以O为圆心作圆&#xff0c;交横线与AB两点&#…

风速Weibull分布和光伏Beta分布的参数拟合方法(含matlab算例)

在风光场景生成、随机优化调度等研究中&#xff0c;常常假设风速服从Weibull分布&#xff0c;太阳辐照度服从Beta分布。那我们如何得到两个分布的参数呢&#xff1f;文本首先介绍了风速Weibull分布和辐照度Beta分布的基本概率模型及其性性质&#xff0c;之后以MATLAB代码为例阐…

读所罗门的密码笔记21_读后总结与感想兼导读

1. 基本信息 所罗门的密码&#xff1a;AI时代的价值、权力与信任 Solomons Code 奥拉夫格罗思 马克尼兹伯格 著 中信出版社,2022年5月出版 1.1. 读薄率 书籍总字数257千字&#xff0c;笔记总字数37780字。 读薄率37780257000≈14.7% 1.2. 读厚方向 千脑智能 脑机穿越 …

基于SpringBoot的“校园新闻网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园新闻网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统功能界面图 用户登录 校园新…

揭秘!回归测试覆盖率究竟是什么?

回归测试覆盖率是软件测试中的一个重要概念&#xff0c;它衡量的是回归测试过程中&#xff0c;能够覆盖到旧代码的比例。在软件开发的生命周期中&#xff0c;每当有新的代码提交或是修改后&#xff0c;都需要进行回归测试以确保新代码不会对原有的功能产生负面影响。 1.什么是…

从入门到实践,详解 Web 爬虫技术(IP池免费送)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

NLP vs. LLMs: 理解它们之间的区别

作者&#xff1a;Elastic Platform Team 随着人工智能持续发展并在无数行业解决问题&#xff0c;技术的一个关键部分是能够无缝地桥接人类语言和机器理解之间的差距。这就是自然语言处理&#xff08;NLP&#xff09;和大型语言模型&#xff08;LLMs&#xff09;的用武之地。它们…

source map 开发优化工具

什么是 Source map 简单来说 Source map 就是一个存储信息的文件&#xff0c;里面储存着位置信息。 Source map 英文释义&#xff1a;源程序映射。 位置信息&#xff1a;转换后的代码 对应的 转换前的代码 位置映射关系。 有了 Source map&#xff0c;就算线上运行的是转换…

电脑技巧:如何把Edge浏览器扩展程序打包安装到其他浏览器

目录 1、进入浏览器扩展界面 2、找到Edge浏览器扩展插件的路径 3、找到需要扩展的插件ID 4、打开浏览器扩展插件目录 5、进入打包扩展界面 6、 安装到其他浏览器 大家日常使用浏览器的时候通常会安装很多浏览器插件&#xff0c;从而大大提升我们的办公效率&#xff0c;有…

带小数点的String类型数据,如何只取整数?

一、场景引入 如果前端页面存在列表展示用户数据&#xff0c;但是用户数据存在非常多的小数位&#xff0c;从页面来看&#xff0c;数据太多就会不太美观&#xff0c;因此&#xff0c;出于场景美化考虑&#xff0c;在不影响业务功能的情况下&#xff0c;可以只展示整数内容&…

代码编辑器特效爆炸html5

源码介绍 代码编辑器特效爆炸html5&#xff0c;代码高亮显示&#xff0c;输入代码爆炸动态效果显示。非常的帅气&#xff0c;爱不释手~ 效果截图 源码下载 代码编辑器特效爆炸html5

Flask 解决指定端口无法生效问题

问题重现 手动指定的IP端口是app.run(host0.0.0.0, port9304)&#xff0c;但是启动的地址显示的却是http://127.0.0.1:5000。 if __name__ __main__:app.run(host0.0.0.0, port9304)启动地址如下&#xff1a; 解决方案 PyCharm会自动识别出来flask项目&#xff08;即使你…

Py深度学习基础|Numpy基础总结

注&#xff1a;本文来自菜鸟教程学习总结 一、数组属性 NumPy 的数组中比较重要 ndarray 对象属性有&#xff1a; 注意&#xff1a;使用reshape后&#xff0c;数组的结构&#xff08;即元素的排列顺序和内在连接&#xff09;没有改变&#xff0c;但因为返回的是一个视图&#…

机器学习笔记 - 使用 OpenCV 的结构化森林进行边缘检测

一、简述 边缘检测是计算机视觉领域中一项非常重要的任务。这是许多纯计算机视觉任务(例如轮廓检测)的第一步。即使涉及深度学习,较深层也首先学习识别边缘,然后再学习图像的复杂特征。所以,我们可以说边缘检测在计算机视觉领域非常重要。拥有良好且高效的图像边缘检测算法…

Flink KafkaSink分区配置的不同版本对比

Flink KafkaSink分区配置的不同版本对比 在不同版本的Flink中&#xff0c;KafkaSink 分区默认配置方式可能会有一些变化。以下是摘自Flink官方文档不同版本的原文&#xff1a; 1. Flink版本&#xff1a;1.12~1.19 Sink 分区 # 配置项 sink.partitioner 指定了从 Flink 分区到 …

Yoshua Bengio独家专访:我不想把大模型未来押注在Scaling Law上,AGI路上要“注意安全”...

导读 漫长的30年间&#xff0c;数度从主流方向的超然出走&#xff0c;是Bengio的制胜秘诀。这种不盲从主流的风格体现在他研究生涯的方方面面。 90年代末期&#xff0c;神经网络被打入冷宫&#xff0c;Bengio的论文多次遭拒&#xff0c;连学生们也开始担心&#xff0c;和他一起…

【ESP32 手机配网教程】

【ESP32 手机配网教程】 1. 前言2. 先决条件2.1 环境配置2.2 所需零件3.3 硬件连接步骤 3. Web热点手动配网3.1. 准备工作3.2. 编译上传程序3.3. 进行手动配网 4. BLE无线配网4.1. 准备工作**4.2. 编译上传程序4.3. 使用手机APP进行无线配网 5. 总结 1. 前言 欢迎使用ESP32进行…

python将xml格式文件转成png或者pdf格式

本文主要介绍运行NCCL代码时输出的xml文件该如何转成更加容易观看的图格式 如下是举例&#xff0c;服务器上的PCIE相关的topo xml 文件 <system version"1"><cpu numaid"1" affinity"ffffff00,0000ffff,ff000000" arch"x86_64&q…

Next.js多页布局getLayout使用方法

目录 官网解释 直接上代码使用方法展示 1.page页面​编辑 2._app.js页面,也放在pages中​编辑 效果展示 有getLayout展示getLayout返回的页面布局 无getLayout展示默认布局 官网解释 如果需要多个布局&#xff0c;可以添加一个属性getLayout添加到您的页面&#xff0c;允…