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

news2024/11/24 2:37:06

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

一、优先队列

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

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

相关文章

Cesium 自定义Primitive - 圆

一、创作思路 1、创建一个自定义CustomPrimitive 2、然后根据两个点&#xff0c;生成圆 3、方便后期绘制圆 二、实现代码 1、在vue的包中加入turf. npm install turf/turf 1、创建一个CustomCirclePrimitive类,并加入更新的代码 export default class CustomCirclePrimitive …

面试问答之Spring进阶

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;说说你对Spring的认识与理解&#x1f415;Bean的分类&#x1f415; BeanFactory 接口和ApplicationContex 接口 的区别&#x1f415;SpringBe…

Text-to-SQL任务中的思维链(Chain-of-thought)探索

导语 在探索LLM在解决Text-to-SQL任务中的潜能时&#xff0c;本文提出了一种创新的‘问题分解’Prompt格式&#xff0c;结合每个子问题的表列信息&#xff0c;实现了与顶尖微调模型&#xff08;RASATPICARD&#xff09;相媲美的性能。 会议&#xff1a;EMNLP 2023链接&#x…

Python给图片加水印

受到“手动给证件加文字太麻烦”的感触&#xff0c;想用Python来实现给图片加水印&#xff0c;这不方便多了。 这里使用PIL模块&#xff1a; from PIL import Image from PIL import ImageFont from PIL import ImageDrawimg_t Image.open(cat.jpg) img_size_t img_t.size…

力扣hot100:560.和为K的子数组(前缀和+哈希表)

分析&#xff1a; 这个题目乍一看&#xff0c;数据大小用暴力解法大概率会超时&#xff0c;可能想用双指针&#xff0c;但是问题出现在 可能存在负数&#xff0c;也就是说即使是找到了一个答案&#xff0c;后面也可能存在负数和正数抵消&#xff0c;又是答案&#xff0c;因此不…

【教程】uni-app iOS打包解决profile文件与私钥证书不匹配问题

摘要 当在uni-app中进行iOS打包时&#xff0c;有时会遇到profile文件与私钥证书不匹配的问题。本文将介绍如何解决这一问题&#xff0c;以及相关的技术细节和操作步骤。 引言 在uni-app开发过程中&#xff0c;iOS打包是一个常见的操作。然而&#xff0c;有时会出现profile文…

Seata 2.x 系列【2】数据库事务

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列Seata 版本 2.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 数据库事务什么是事务事务的作用数据库事务模型显式事…

基于Java springboot+VUE+redis实现的前后端分类版网上商城项目

基于Java springbootVUEredis实现的前后端分类版网上商城项目 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

linux上的xtrabackup更换版本

linux上安装的xtrabackup版本为8.0版本&#xff0c;与当前库的版本不一致&#xff0c;如何更换xtrabackup的版本 xtrabackup --version xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64) (revision id: 6beb4b49)如何下载 首先到percona的官网去下…

Excel中怎么求排名

使用Rank函数 1.在需要显示排名的单元格内&#xff0c;输入“RANK&#xff08;数值&#xff0c;数值列表&#xff0c;排序方式&#xff09;” 2.将“数值”替换为需要计算排名的单元格的地址&#xff0c;例如E2单元格。 3.将“数值列表”替换为排名的数值范围&#xff0c;例…

vue接入百度地图获取经纬度

通过城市名称和城市中心经纬度来获取当前所在地图&#xff0c;当前经纬度中心获取可以通过后端获取 静态文件包&#xff0c;替换baidu.html中的ak值&#xff0c;ak值通过百度地图官方网站申请 申请&#xff1a;百度地图API申请步骤 - 知乎 代码示例文件&#xff1a; 链接&a…

【Linux基础(一)】设备和文件IO

学习分享 1、Linux中的设备管理1.1、设备管理的特点1.2、设备分类1.3、设备工作原理1.4、Linux设备操作1.5、系统调用和系统API等区别 2、文件IO2.1、C库的文件操作2.2、文件描述符2.3、特殊文件描述符2.4、系统调用2.4.1、open系统调用4-12.4.2、open系统调用4-22.4.3、write系…

【李沐精读系列】BERT精读

论文&#xff1a;BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 参考&#xff1a;BERT论文逐段精读、李沐精读系列、李宏毅版BERT讲解 一、介绍 BERT(Bidirectional EncoderRepresentation Transformer&#xff0c;双向Transformer编码器…

【C++】类与对象(上篇)

一.类的引入 C与C语言比较起来&#xff0c;C引入了一个新的概念&#xff0c;叫做类。那么在C中&#xff0c;类又是什么呢&#xff1f; 在C中&#xff0c;类与C语言中的结构体相似&#xff0c;但不同的是&#xff0c;C中的类中&#xff0c;不仅可以定义变量&#xff0c;还能定义…

时间复杂度考点总结

【2022统考真题】下列程序段的时间复杂度是( )。 int sum0; for(int il;i<n;i*2) for(int j0;j<i;j) sum; 这道题容易错选为C,正确答案是B 解答&#xff1a;i1时循环1次&#xff0c;i2时循环2次&#xff0c;i4时循环4次&#xff0c;所以循环次数…

wy的leetcode刷题记录_Day82

wy的leetcode刷题记录_Day82 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2024-3-6 前言 目录 wy的leetcode刷题记录_Day82声明前言2917. 找出数组中的 K-or 值题目介绍思路代码收获 143. 重排链表题目介绍思路代码收获 146. LRU 缓存…

【C/C++】结构体内存对齐 ----- 面试必考(超详细解析,小白一看就懂!!!)

目录 一、前言 二、引出 ---- 结构体内存对齐 &#x1f34e;结构体偏移量计算&#xff1a;offsetof &#x1f95d;结构体内存对齐详解 &#x1f4a6;规则介绍&#xff08;重点&#xff01;&#xff01;&#xff09; &#x1f4a6;例题解析 三、习题演练 &#x1f34d;练习① …

Vue.js+SpringBoot开发森林火灾预警系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟雾传感器模块2.4 温度传感器模块2.5 历史记录模块2.6 园区数据模块 三、系统设计3.1 用例设计3.1.1 森林园区基础系统用例设计3.1.2 森林预警数据用例设计 3.2 数据库设计3.2.1 烟雾…

JAVA毕业设计633—基于Java+ssm的医院挂号系统(源代码+数据库+11000字论文+开题)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于Javassm的医院挂号系统(源代码数据库11000字论文开题)633 一、系统介绍 本系统分为管理员、医生、用户三种角色 1、用户&#xff1a; 注册、登录、医生预约、评价、收藏、健…

【EI会议征稿通知】第四届人工智能,大数据与算法国际学术会议 (CAIBDA 2024)

第四届人工智能&#xff0c;大数据与算法国际学术会议 (CAIBDA 2024) 2024 4th International Conference on Artificial Intelligence, Big Data and Algorithms 由河南省科学院、河南大学主办&#xff0c;河南省科学院智慧创制研究所、河南大学学术发展部、河南大学人工智能…