86、【栈与队列】leetcode ——39. 滑动窗口最大值:单调队列+滑动窗口(C++版本)

news2025/1/21 18:52:33

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
239. 滑动窗口最大值

一、单调队列+滑动窗口方法

本题的特点是维护一个窗口,在窗口不断向前移动时,获取其中的最大值。由于窗口在向前移动过程中,元素存在着进入和出去的连续顺序,与FIFO的特点类似。

故可考虑用队列实现。而优先队列(按某种优先级顺序排列)正好满足我们的需求,但每次维护顺序时,需要进行堆排序,时间复杂度会是 O ( n l o g n ) O(nlogn) O(nlogn)

但本题我们实际上只需要维护最近中的最大值元素而已,并不需要对所有添加过的元素都进行维护,因此我们可使用单调队列(队列内元素单调不减或单调不增),保证队头元素为最大值队内元素按单调不增排列。每次从队尾加入元素,当已存入的队尾元素比待加入元素小时,弹出旧元素,直至队尾当前指向元素大于或等于待加入元素时,将其加入队尾,从而实现队内单调不减。可保证维护对顺序的时间复杂度为 O ( n ) O(n) O(n)

在移动窗口的过程中,当队头元素与移除元素相同时,则弹出。不同时,则不弹出。然后将进入窗口的元素加入到队内,每次都将队头中的最大值加入到结果集中。
image.png

class Solution {
public:
    // 构建一个单调队列(队列中的数值由大到小,单调不减)
    class MyDeque {
    public:
        deque<int> que;
        // 从队头弹出与目标相等的数
        void pop(int value) {
        	// 若移出窗口元素不为最大值,则在此之前已被弹出。若为最大值,则此时会弹出。
            if(!que.empty() && que.front() == value) {
                que.pop_front();
            }
        }
        // 压入数并保证队列内的数由大到小,单调不减排列
        void push(int value) {
            // 当最后一个数小于待入队的数时,将队尾处的元素弹出,直至队尾指向元素大于等于待入队元素
            while(!que.empty() && que.back() < value) {
                que.pop_back();
            }
            // 当最后一个数大于或等于待入队元素时,存入队尾
            que.push_back(value);
        }
        // 获取队首元素(最大值)
        int front() {
            return que.front();
        }
    };
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MyDeque que;
        vector<int> res;
        // 先将前k个数入队,列出最大值
        for(int i = 0; i < k; i++) {
            que.push(nums[i]);
        }
        res.push_back(que.front());
        // 之后每次都对比队首弹出一个元素,再入队一个元素,将最大值再加入res中
        for(int i = k; i < nums.size(); i++) {
            // 弹出移出窗口元素
            que.pop(nums[i - k]);
            // 加入进入窗口元素
            que.push(nums[i]);
            // 获取窗口内的最大值,加入进去
            res.push_back(que.front());
        }
        return res;
    }
};

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( k ) O(k) O(k) (队内元素最大为一个窗口的大小)

参考文章:239. 滑动窗口最大值、单调队列结构解决滑动窗口问题、滑动窗口最大值、

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

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

相关文章

【数据结构】初识数据结构,十分钟带你玩转算法复杂度

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一、初识数据结构&#x1f95d;&#xff1a; 1.数据结构&#xff1a; 2.算法&#xff1a; &#x1f353;二、算法效率&#x1f353;&#xff1a; &#x1f348;三、算法复杂度&#x1f348;&#xff1a; 1.时…

4-1文件管理-文件系统基础

文章目录一.文件的基本概念二.文件的逻辑结构&#xff08;一&#xff09;无结构文件/流式文件&#xff08;二&#xff09;有结构文件1.顺序文件2.索引文件3.索引顺序文件4.直接文件/散列文件三.文件目录四.文件的物理结构/文件分配方式1.连续分配2.链接分配3.索引分配五.文件存…

数据结构与算法基础(王卓)(8)附:关于new的使用方法详解

part 1&#xff1a; C中new的用法&#xff08;不过就是&#xff09;如下&#xff08;几种用法&#xff09;&#xff1a; 1&#xff1a; new<数据类型> 分配&#xff1a; 指定类型的&#xff0c;大小为1的&#xff0c;内存空间&#xff1b; int *i new int;//注意&am…

13_3、Java的IO流之节点流的使用

一、FileReader和FileWriter的使用1、数据读入操作说明&#xff1a;①read():返回读入的第一个字符&#xff0c;当读到文档末尾&#xff0c;返回-1②异常的处理&#xff1a;为了保证流资源一定会执行关闭操作&#xff0c;要对异常进行try-catch-finally处理③对于读入操作&…

【PWA学习】1. 初识 PWA

什么是PWA PWA(Progressive Web Apps&#xff0c;渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序。这些应用无处不在、功能丰富&#xff0c;使其具有与原生应用相同的用户体验优势 我们需要理解的是&#xff0c;PWA 不是某一项技术&am…

MAC(m1)-VMWare Fusion CentOS8设置静态IP、SSH连接

在使用虚拟机的时候&#xff0c;默认情况下使用的DHCP协议&#xff08;根据网段自动分配ip&#xff09;分配的动态IP地址&#xff0c; 使得每次打开虚拟机后当前的IP地址都会发生变化&#xff0c;这样不方便管理。为了能够给当前虚拟机设置 一个静态IP地址&#xff0c;方便后…

Linux的开发工具——软件包管理器 yum

目录 1 查看 2 安装 3 卸载 4 常用软件 5 扩展细节 5.1 yum源 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成window…

【自学Python】Python标识符和保留字

Python标识符 Python标识符教程 Python 对各种 变量、方法、函数等命名时使用的字符序列称为标识符。 也可以说凡是自己可以起名字的地方都叫标识符&#xff0c;简单地理解&#xff0c;标识符就是一个名字&#xff0c;它的主要作用就是作为变量、函数、类、模块以及其他对象…

柱承重式钢模块建筑结构体系适用高度研究

作者&#xff1a;陈志华 冯云鹏 刘佳迪 刘洋 钟旭 模块建筑网 导语 摘要&#xff1a;模块建筑作为一种新兴的建筑体系&#xff0c;具有较高的预制化和装配化程度&#xff0c;符合建筑工业化以及绿色建筑的发展要求&#xff0c;但国内的模块建筑大多只应用于低多层&#xff0c;…

[付源码+数据集]Github星标上万,23 个机器学习项目汇总

在本文中分享了涵盖面向初学者&#xff0c;中级专家和专家的23种机器学习项目创意&#xff0c;以获取有关该增长技术的真实经验。这些机器学习项目构想将帮助你了解在职业生涯中取得成功、和当下就业所需的所有实践。 通过项目学习是你短期内能做的最好投资&#xff0c;这些项…

.NET 6结合SkiaSharp实现拼接验证码功能

从最初的滑动验证码&#xff0c;到实现旋转验证码&#xff01;不光实践了SkiaSharp的使用&#xff0c;也学到了很多东西。在网上看到一个拼接验证码功能&#xff0c;手痒了起来&#xff0c;结合前面实现的两种验证码&#xff0c;我们来学习一下如何实现拼接验证码功能&#xff…

流量路由技术解析

作者&#xff1a;十眠 流量路由&#xff0c;顾名思义就是将具有某些属性特征的流量&#xff0c;路由到指定的目标。流量路由是流量治理中重要的一环&#xff0c;本节内容将会介绍流量路由常见的场景、流量路由技术的原理以及实现。 流量路由的业务场景 我们可以基于流量路由…

aws sam 本地测试部署 lambda 和 apigateway

使用sam框架可以在部署serverless应用之前&#xff0c;在本地调试application是否符合预期 sam框架安装 serverless应用是lambda函数&#xff0c;事件源和其他资源的组合 使用sam能够基于docker容器在本地测试lambda函数 安装sam wget https://github.com/aws/aws-sam-cli…

ArcGIS基础实验操作100例--实验77按要素分区统计路网

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验77 按要素分区统计路网 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

ART-SLAM: Accurate Real-Time 6DoF LiDAR SLAM

IEEE Robotics and Automation Letters 意大利米兰理工学院 Abstract 地面车辆实时六自由度姿态估计&#xff0c;由于自动驾驶和三维建图等诸多应用&#xff0c;是机器人技术中一个相关和被研究广泛的课题。虽然有些系统已经存在&#xff0c;但它们要么不够准确&#xff0c;要…

Qt之标准对话框(QMessageBox、QFileDialog)

文章目录前言如何学习标准对话框QMessageBox消息对话框应用属性实操QFileDialog文件对话框应用属性实操前言 Qt为开发者提供了一些可复用的对话框&#xff0c;他对我们的开发是很重要的。下面我们就来学习 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考…

无监控,不运维!深入浅出介绍ChengYing监控设计和使用

监控系统俗称「第三只眼」&#xff0c;几乎是我们每天都会打交道的系统&#xff0c;它也一直是IT系统中的核心组成部分&#xff0c;负责问题的发现以及辅助性的定位。 ChengYing作为一站式全自动化全生命周期大数据平台运维管家&#xff0c;自然也提供大数据产品的监控服务。这…

力扣sql基础篇(二)

力扣sql基础篇(二) 1 每月交易I 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # sum函数如果需要筛选,可以考虑在里面嵌套if函数 SELECT DATE_FORMAT(trans_date,"%Y-%m") month,country,count(*) trans_count,COUNT(IF(state"appr…

matlab利用逻辑数组将保密率负数部分转换为零

通信中计算保密率的公式为 r[Rd−Re]r[R_d-R_e]^ r[Rd​−Re​] 其中RdR_dRd​代表合法目的地的数据速率&#xff0c;ReR_eRe​代表窃听节点的数据速率 当窃听节点的速率大于目的节点的速率时候&#xff0c;计算出来的保密率是负值&#xff0c;这在设计的时候可以将这时候的保…

referer、prototype、array、json笔记整理

目录referer、prototype、array、json笔记整理refererReferrer-policy如何设置referer绕过图片防盗链1、利用https网站盗链http资源网站&#xff0c;refer不会发送2、设置meta3、设置referrerpolicy"no-referrer"4、利用iframe伪造请求referer5、客户端在请求时修改h…