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

01c4bcba5fa645078ef31e9cb42d73b4.png

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

一、优先队列

        在使用优先队列时,我们会遇到这样的问题:如何将一个目标数从优先队列中弹出?如果使用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;
    }
};

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

071d2b74db64428e894c55af19b959ee.png

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;
    }
};

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是GoogLeNet,亮点是什么,为什么是这个结构?

GooLeNet 亮点 最明显的亮点就是引入了Inception&#xff0c;初衷是多卷积核增加特征的多样性&#xff0c;提高泛化能力 &#xff0c;比如&#xff0c;最下边是一个输入层&#xff0c;然后这个输入分别传递给1*1&#xff0c;3 * 3 &#xff0c;5 * 5和一个最大池化层&#xff…

IP数据报格式

每一行都由32位比特&#xff0c;即4个字节组成&#xff0c;每个格子称为字段或者域。IP数据报由20字节的固定部分和最大40字节的可变部分组成。 总长度 总长度为16个比特&#xff0c;该字段的取值以字节为单位&#xff0c;用来表示IPv4数据报的长度(首部长度数据载荷长度)最大…

Long-term Correlation Tracking LCT 目标跟踪算法源码运行

资源 LCT-tracker项目地址VLFeat官网OpenCV下载地址OTB50数据集百度网盘资源 参考博客 一步一步教你跑lct-tracker&#xff08;Win10Matlab 2016bVisual Studio 2015&#xff09;LCT代码跑起来先文章思路总结 正文 1. 环境配置 我的环境&#xff1a;Win11、Visual Studio…

python+realsense

单目相机(RGB影像):分辨率&#xff1a;320180,320240,424240,640360,640480,848480,960540,1280720,19201080&#xff1b;帧率&#xff1a;6,15,30,60 按照博文Python实战之Realsense_realsense python-CSDN博客的代码显示如下&#xff08;我更改了分辨率和帧率&#xff0c;大…

设计模式:观察者模式 ⑧

一、思想 观察者模式是一种常见的设计模式&#xff0c;也称作发布-订阅模式。它主要解决了对象之间的通知依赖关系问题。在这种模式中&#xff0c;一个对象&#xff08;称作Subject&#xff09;维护着一个对象列表&#xff0c;这些对象&#xff08;称作Observers&#xff09;都…

css3中nth-child属性作用及用法剖析

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 标题&#xff1a;CSS3中nth-child属性作用及用法剖析 摘要&#xff1a;CSS3中的nth-child选择器允许我们根据元素位置来定位特定的元素…

Vue3中Vue Router的使用区别

在 Vue 3 中&#xff0c;useRouter 和 useRoute 是两个用于 Vue Router 的 Composition API 函数&#xff0c;它们的用途和返回的对象不同&#xff0c;接下来详细了解一下它们的区别以及如何正确使用它们。 useRouter useRouter 用于获取 router 实例&#xff0c;这个实例提供…

python(5)之处理数组

上次代码结果如下&#xff1a; 1、处理数组的缺失值 1、isnan&#xff08;&#xff09;函数 isnan&#xff08;&#xff09;函数是Numpy模块里的一个可以标记数组中缺失值的位置 代码示例如下&#xff1a; import numpy as np ac np.array([1,2,3,2,3,4,5,9,np.nan,1]) p…

OSPF收发报文实验简述

1、OSPF采用组播形式收发报文&#xff0c;这样可以减少对其它不运行OSPF路由器的影响。 通过wireshark软件对r2 e0/0/0 端口进行数据抓包&#xff0c;发现224.0.0.5为组播地址&#xff0c;如下图

深入了解二叉搜索树:原理、实现与应用

目录 一、介绍二叉搜索树 二、二叉搜索树的基本性质 三、二叉搜索树的实现 四、总结 在计算机科学中&#xff0c;数据结构是构建算法和程序的基础。其中&#xff0c;二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;作为一种常见的数据结构&#…

力扣图论篇

以下思路来自代码随想录以及官方题解。 文章目录 797.所有可能的路径200.岛屿数量130.被围绕的区域1020.飞地的数量 797.所有可能的路径 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不…

基于PySide2实现调用本地摄像头抓拍并保存照片(Python版本)

因为横向课题需要&#xff0c;这是其中的一个小小的功能&#xff0c;单独拎出来作为一个小demo&#xff0c;方便后续学习使用 项目实现功能&#xff1a; 点击open按钮&#xff0c;摄像头开启&#xff0c;实时捕获周围图像并显示 点击capture按钮&#xff0c;保存摄像头照片&am…

Day6 java 常用API

文章目录 1、Calendar1.1 Calendar日历对象 2、JDK8 之后新增的时间类2.1 LocalDate、LocalTime 、LocalDateTime2.2 ZoneId 、ZoneIdTime2.3 Instant2.4 DateTimeFormatter2.5 Period2.6 Duration 1、Calendar 在了解calendar之前&#xff0c;先用SimpleDateFormat 写一个小例…

保持长期高效的七个法则(一)7 Rules for Staying Productive Long-Term(1)

Easily the best habit I’ve ever started was to use a productivity system.The idea is simple:organizing all the stuff you need to do (and how you’re going to do it) prevents a lot of internal struggle to get things done. 无疑&#xff0c;我曾经建立过的最好…

C++面试宝典一部分

今天整理书籍资料时&#xff0c;发现多年前打印的面试资料&#xff0c;拍照分享给大家。

ai+模型选择+过拟合和欠拟合

ai模型选择过拟合和欠拟合 1模型选择1训练误差和泛化误差2验证数据集和测试数据集3k-折交叉验证4总结 2过拟合和欠拟合1模型容量2估计模型容量3VC维4数据复杂度5总结 3代码 1模型选择 1训练误差和泛化误差 训练误差&#xff08;Training Error&#xff09;和泛化误差&#xff…

代码随想录刷题笔记-Day29

1. N皇后 51. N 皇后https://leetcode.cn/problems/n-queens/ 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数…

LVS+Keepalived 高可用负载均衡集群

一. 高可用集群的相关知识 1.1 高可用&#xff08;HA&#xff09;集群和普通集群的比较 ① 普通集群 普通的群集的部署是通过一台度器控制调配多台节点服务器进行业务请求的处理&#xff0c;但是仅仅是一台调度器&#xff0c;就会存在极大的单点故障风险&#xff0c;当该调度…

20-Java备忘录模式 ( Memento Pattern )

Java备忘录模式 摘要实现范例 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象 备忘录模式属于行为型模式 摘要 1. 意图 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对…

《时间贫困》

作者&#xff1a;【英】凯茜霍姆斯 深陷困境&#xff1a;时间贫困且精疲力竭 我们生活在生产力至上的文化中&#xff0c;忙碌已经成了一种身份的象征&#xff0c;也是个人价值的一种体现。然而&#xff0c;基于我个人的经历和研究&#xff0c;我发现这种忙碌的生活状态并不能…