力扣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.hqwc.cn/news/517671.html

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

相关文章

Linux的时间操作

文章目录 常见的Linux时间操作命令和方法&#xff1a;**查看系统时间****修改系统时间****同步硬件时钟与系统时钟****时区设置** Linux下关于时间操作的具体实例&#xff1a;在Linux系统中进行时间操作时&#xff0c;需要注意以下几个问题&#xff1a; 常见的Linux时间操作命令…

CorelDRAW2024专业级图形设计矢量图形设计软件

CorelDRAW2024是一款功能强大的矢量图形设计软件&#xff0c;适用于专业级图形设计作品的设计师和创作者。它提供了智能对象、布局、插图和模板等功能&#xff0c;可以帮助用户快速创建高质量的设计作品。 这款软件的用户界面直观且易于使用&#xff0c;允许用户快速访问和管理…

django学习记录07——订单案例(复选框+ajax请求)

1.订单的数据表 1.1 数据表结构 1.2 数据表的创建 models.py class Order(models.Model):"""订单号"""oid models.CharField(max_length64, verbose_name"订单号")title models.CharField(max_length64, verbose_name"名称&…

企微hook源码

企微hook源码已经在QQ群内开源。速度进群下载&#xff0c;避免和谐。 QQ群&#xff1a;649480745

武装你的BurpSuite听着反方向的钟让打点更加轻而易举

分块传输-Chunked coding converter github&#xff1a;https://github.com/c0ny1/chunked-coding-converter 使用方法 我们上传一句话木马&#xff0c;使用burp进行抓包 发现有安全狗防火墙&#xff0c;这时插件Chunked coding converter起到作用了 点击右键进行分块上传 …

Conda快速安装的解决方法(Mamba安装)

如果你的Conda安装了&#xff0c;你可能会发现一个问题&#xff0c;就是使用Conda install 安装某个软件时&#xff0c;会特别慢&#xff0c;这时候呢&#xff1f;你会上网去搜&#xff0c;然后大家解决的方法呢。一是告诉你镜像可以下载快一点&#xff0c;二是&#xff0c;Mam…

如何让多个视频同时转GIF 2024全新款 高清无损转换

大家是否经常会遇到这样的问题&#xff0c;看到一些有趣的短视频片段&#xff0c;但却不知道如何将它们转换成GIF动图&#xff1f;今天&#xff0c;小编就给大家分享一个简单教程&#xff0c;教你如何批量将喜欢的短视频转换成GIF动图&#xff0c;让我们一起来学习吧&#xff0…

南卡、Oladance、Cleer开放式耳机好用吗?2024真实维度测试对比

​作为一名拥有五年数码评测经验的博主&#xff0c;我有幸深入体验了市场上众多蓝牙耳机&#xff0c;从新兴小众品牌到知名大厂的产品&#xff0c;我都一一尝试。同时&#xff0c;我也经常收到不同品牌的邀请&#xff0c;希望我能为他们的产品提供评测服务。此外&#xff0c;我…

LVS负载均衡集群基础概念

目录 一、集群 1、集群概述 1.1 什么是集群 1.2 集群系统扩展方式 1.2.1 Scale UP&#xff08;纵向扩展&#xff09; 1.2.2 Scale OUT&#xff08;横向扩展&#xff09; 1.2.3 区别 1.3 分布式系统 1.4 分布式与集群 1.5 集群设计原则 1.6 集群设计实现 1.6.1 基础…

springBoot整合Redis(三、整合Spring Cache)

缓存的框架太多了&#xff0c;各有各的优势&#xff0c;比如Redis、Memcached、Guava、Caffeine等等。 如果我们的程序想要使用缓存&#xff0c;就要与这些框架耦合。聪明的架构师已经在利用接口来降低耦合了&#xff0c;利用面向对象的抽象和多态的特性&#xff0c;做到业务代…

答题pk小程序源码技术大解析

答题pk小程序源码解析 在数字化时代&#xff0c;小程序因其便捷性、即用性而受到广泛欢迎。其中&#xff0c;答题pk小程序更是成为了一种寓教于乐的现象。它不仅为用户提供了趣味性的知识竞技平台&#xff0c;还为企业、教育机构等提供了互动营销和知识传播的新途径。本文将对…

回溯五题【Leetcode17数独/37组合问题/51N皇后/212字典树/980状态压缩】

文章目录 关于回溯37. 解数独&#xff08;37.sudoku-solver&#xff09;17. 电话号码的数字组合&#xff08;17.letter-combinations-of-a-phone-number&#xff09;51. N皇后&#xff08;51.n-queens&#xff09;212. 单词搜索 II&#xff08;212.word-search-ii&#xff09;简…