力扣hot100:239.滑动窗口最大值(优先队列/单调队列)

本题是一个经典的单调队列题。不过用优先队列也能解决。

一、优先队列

        在使用优先队列时,我们会遇到这样的问题:如何将一个目标数从优先队列中弹出?如果使用stl这是办不到的,虽然可以自行实现这样的功能。但是我们可以这样思考,我们保存数的位置信息延迟出队,当一个数在堆顶时,判断其是否在窗口中,不在窗口中则舍弃,一直找到在窗口中的数。判断是否在窗口中只需要保存这个数入队时的位置信息,在窗口之外则舍弃。 由于每个数进入优先对列(排序) 和 出优先对列 最多一次,则时间复杂度为nlogn+n。

时间复杂度:O(nlogn)<每个数进队进行一次logn排序,每个数进队出队最多一次>

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {priority_queue<pair<int,int> > Q;vector<int> ans;for(int i=0;i<k;++i) Q.push({nums[i],i});//这里first成员一定要是数值int len=nums.size()-k;for(int i=0;i<len;++i){while(Q.top().second<i) Q.pop();ans.push_back(Q.top().first);Q.push({nums[i+k],i+k});}while(Q.top().second<len) Q.pop();ans.push_back(Q.top().first);return ans;}
};

二、单调队列

        单调队列实际上就是时刻保存一个按顺序站好队的队列,这个队列的特殊性是不保存无效成员,且队头一定是当前答案。一旦更能成为答案的出现了,就不再保存不能成为答案的成员。

        相当于n个人排成一对,小明想依次记录每k个人的身高中最高的那一个。如果小明发现某次的k个人中有以个人比前面的人都高,那么小明在接下来看最高的人时,根本不用再记着这个人前面的人,因为他们在后面不会起到作用。虽然这个人后面的人可能比较矮,但可能在之后是最高的呀,因此还需要记录着。对于每一个人都是如此,他前面的比它矮的都没有用了,因此可以维护一个双端队列,在考虑某个人时,这个人如果比队列后面的人高,则把这些人出队,接下来就不再考虑了,但是队头的人一定是最高的吗? 是的,但是还需要看看它是否在被考虑的k个人中。

        每个数入队出队最多一次,不需要进行排序,时间复杂度O(n)

记录身高以及位置信息:

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<pair<int,int>> myque;int len=nums.size()-k;vector<int> ans;for(int i=0;i<k;++i) {while(!myque.empty()&&myque.back().first<=nums[i]) myque.pop_back();myque.push_back({nums[i],i});}for(int i=0;i<len;++i) {while(!myque.empty()&&myque.front().second<i) myque.pop_front();ans.push_back(myque.front().first);int temp=i+k;while(!myque.empty()&&myque.back().first<=nums[temp]) myque.pop_back();myque.push_back({nums[temp],temp});}while(myque.front().second<len) myque.pop_front();ans.push_back(myque.front().first);return ans;}
};

实际上不用记录身高,因为身高可以用位置信息直接得到(但优先队列不一样,是因为优先队列要在内部排序):

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<int> myque;int len=nums.size()-k;vector<int> ans;for(int i=0;i<k;++i) {while(!myque.empty()&&nums[myque.back()]<=nums[i]) myque.pop_back();myque.push_back(i);}for(int i=0;i<len;++i) {while(!myque.empty()&&myque.front()<i) myque.pop_front();ans.push_back(nums[myque.front()]);int temp=i+k;while(!myque.empty()&&nums[myque.back()]<=nums[temp]) myque.pop_back();myque.push_back(temp);}while(myque.front()<len) myque.pop_front();ans.push_back(nums[myque.front()]);return ans;}
};

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

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

相关文章

VSCode安装教程(版本:1.87.0)Windows10

安装完Python后&#xff0c;我们即可在自己的电脑上开始学习Python编程。在此之前&#xff0c;我们需要一个代码编辑器&#xff0c;此处我推荐的是Visual Studio Code&#xff08;简称VS Code&#xff09;。可能你会好奇&#xff0c;Python安装时不是自带了一个代码编辑器吗&am…

男人的玩具系统wordpress外贸网站主题模板

垂钓用品wordpress外贸模板 鱼饵、鱼竿、支架、钓箱、渔线轮、鱼竿等垂钓用品wordpress外贸模板。 https://www.jianzhanpress.com/?p3973 身体清洁wordpress外贸网站模板 浴盐、防蚊液、足部护理、沐浴液、洗手液、泡澡用品wordpress外贸网站模板。 https://www.jianzhan…

基于微信小程序的电影院订票选座系统的设计与实现(程序+数据库+)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

[Redis]——缓存击穿和缓存穿透及解决方案(图解+代码+解释)

目录 一、缓存击穿&#xff08;热点Key问题&#xff09; 1.1 问题描述 1.2 解决方案及逻辑图 1.2.1 互斥锁 1.2.2 逻辑过期 二、缓存穿透 2.1 问题描述 2.2 解决方案逻辑图 2.2.1 缓存空对象 2.2.2 布隆过滤器 一、缓存击穿&#xff08;热点Key问题&#xff09; 个人理…

“首件检验”为什么至关重要?(内附流程规范)

在产品的设计及生产过程中&#xff0c;经常会出现设计变更、工艺变更、制程调整、非计划停线及转产、转线等“变化”。 如何确保这些“变化”不影响产品后续的生产品质&#xff1f;这就需要在作业准备验证、停产后验证阶段&#xff0c;进行不能缺少的重要环节——“首件检验”。…

ruoyi-vue框架密码加密传输

先看一下改造后的样子&#xff0c;输入的密码不会再以明文展示。 下面我主要把前后端改造的代码贴出来。 1.后端代码 RsaUtils类 在com.ruoyi.common.utils包下新建RsaUtils类&#xff0c;RsaUtils添加了Component注解 generateKeyPair()构建密钥对添加了Bean注解 在项目启动…

大语言模型系列-GPT-2

文章目录 前言一、GPT-2做的改进二、GPT-2的表现总结 前言 《Language Models are Unsupervised Multitask Learners&#xff0c;2019》 前文提到&#xff0c;GPT-1利用不同的模型结构微调初步解决了多任务学习的问题&#xff0c;但是仍然是预训练微调的形式&#xff0c;GPT-…

【Spring高级】第2讲:容器实现类

目录 BeanFactory实现BeanDefinition后置处理器单例bean创建后置处理器顺序总结 ApplicationContext实现ClassPathXmlApplicationContextFileSystemXmlApplicationContextAnnotationConfigApplicationContextAnnotationConfigServletWebServerApplicationContext BeanFactory实…

Ubuntu环境配置-LinuxQQ篇

本教程下载Linux QQ的版本是linuxqq_3.0.0-571_amd64.deb 一、下载LinuxQQ 直接使用wget命令下载链接&#xff0c;下载文件 wget https://dldir1.qq.com/qqfile/qq/QQNT/c005c911/linuxqq_3.0.0-571_amd64.deb 二、安装LinuxQQ 当下载完成后&#xff0c;运行命令&#xff1a;…

图像锐化-拉普拉斯算子 Sobel算子

算子解释 广义的讲&#xff0c;对任何函数进行某一项操作都可以认为是一个算子&#xff0c;甚至包括求幂次&#xff0c;开方都可以认为是一个算子&#xff0c;只是有的算子我们用了一个符号来代替他所要进行的运算罢了&#xff0c;所以大家看到算子就不要纠结&#xff0c;他和f…

Sentinel 规则持久化,基于Redis持久化【附带源码】

B站视频讲解 学习链接&#x1f517; 文章目录 一、理论二、实践2-1、dashboard 请求Redis2-1-1、依赖、配置文件引入2-1-2、常量定义2-1-3、改写唯一id2-1-4、新Provider和Publisher2-1-5、改写V2 2-2、应用服务改造2-2-1、依赖、配置文件引入2-2-2、注册监听器 三、源码获取3…

Talk|加州大学圣地亚哥分校程旭欣:视觉反馈下足式机器人的全身操作与运动

本期为TechBeat人工智能社区第576期线上Talk。 北京时间3月6日(周三)20:00&#xff0c;加州大学圣地亚哥分校博士生—程旭欣的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “视觉反馈下足式机器人的全身操作与运动”&#xff0c;向大家系统地介绍…

智能驾驶规划控制理论学习07-规划算法整体框架

一、解耦合策略 1、路径-速度解耦策略概述 路径-速度解耦指的是将车辆的运动分成路径规划和速度规划两部分&#xff0c;对两个部分分别进行研究。 路径规划&#xff1a; 假设环境是“静态的”&#xff0c;将障碍物投射到参考路径上&#xff0c;并规划一条避开它们的路径&…

【C语言】linux内核napi_gro_receive和netif_napi_add

napi_gro_receive 一、注释 // napi_gro_receive是网络设备接口的一个函数&#xff0c;它被NAPI&#xff08;New API&#xff09;网络轮询机制使用&#xff0c;用于接收和处理接收到的数据包。 // 这个函数通过通用接收分组&#xff08;GRO&#xff0c;Generic Receive Offlo…

Ubuntu安装conda以后,给jupyter安装C++内核

前言 大家都知道&#xff0c;jupyter notebook 可以支持python环境&#xff0c;可以在不断点调试的情况下&#xff0c;打印出当前结果&#xff0c;如果代码错了也不影响前面的内容。于是我就想有没有C环境的&#xff0c;结果还真有。 参考文章&#xff1a; 【分享】Ubuntu安装…

【金三银四的季节看下Java ORM的走向和性能对比】总结

写在最后 经过将近一周时间的框架收集、学习、实验、编码、测试市面上常见的ORM框架&#xff0c;过程中拜读了很多作者的博文、样例&#xff0c;学习很多收获很多。 重新梳理下整理的框架&#xff1a;mybatis-plus、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp、jpa、…

什么是工业交换机?

如今&#xff0c;工业交换机在能源、环保、交通、智慧城市监控等各个行业都发挥着至关重要的作用&#xff0c;其需求也日益增长。本文将全面介绍工业交换机&#xff0c;帮助你进一步加深了解。 什么是工业交换机&#xff1f; 工业交换机&#xff0c;又称工业以太网交换机&…

《探索自动驾驶技术的前景与挑战》

自动驾驶技术,作为现代科技的一大突破,正逐渐改变着我们的交通方式、生活方式以及整个社会结构。本文将围绕自动驾驶技术的现状、优势、局限性以及未来发展趋势展开探讨。 自动驾驶技术的现状概述 自动驾驶技术作为当今科技领域的一项前沿技术,已经取得了巨大的进展并在不同…

安卓开发之资源概述、优劣分析与优化方案

摘要 随着智能手机的普及&#xff0c;Android操作系统已成为全球最广泛使用的移动平台之一。在Android应用开发中&#xff0c;资源管理是构建高效、响应迅速且用户友好的应用程序的关键要素。 本文主要探讨了安卓应用程序开发过程中的资源管理机制&#xff0c;包括其基本结构、…

一键清除JavaScript代码中的注释:使用正则表达式实现

这个正则表达式可以有效地匹配 JavaScript 代码中的各种注释&#xff0c;并且跳过了以 http: 或 https: 开头的链接。 /\/\*[\s\S]*?\*\/|\/\/[^\n]*|<!--[\s\S]*?-->|(?<!http:|https:)\/\/[^\n]*/gvscode 实战&#xff0c;ctrlF 调出查找替换工具&#xff0c;点…