数据结构之----------单调队列

数据结构与算法:单调队列 单调队列 阅读详情

单调队列

单调队列的作用就是维持某一个区间的最值

其中有两个版本

  • 根据下标来进行维护单调队列
  • 根据值来维护单调队列
239. 滑动窗口最大值

难度困难1036

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

示例 2:

输入:nums = [1], k = 1
输出:[1]

示例 3:

输入:nums = [1,-1], k = 1
输出:[1,-1]

示例 4:

输入:nums = [9,11], k = 2
输出:[11]

示例 5:

输入:nums = [4,-2], k = 2
输出:[4]

根据下标维护单调队列

关键在于,队列里面一直维持着窗口范围内递增或递减的下标,并且,根据队列头的下标来判断是否队列头部元素已经不在窗口内

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;
        deque<int> de;
        // 用单调队列
        for(int i=0;i<k;i++) {
            while(!de.empty() && nums[de.back()]<nums[i]) {
                de.pop_back();
            }
            de.push_back(i);
        }

        res.push_back(nums[de.front()]);

        for(int i=k;i<nums.size();i++) {
            while(!de.empty() && de.front()<i-k+1) {
                de.pop_front();
            }
             while(!de.empty() && nums[de.back()]<nums[i]) {
                de.pop_back();
            }
            de.push_back(i);
            res.push_back(nums[de.front()]);



        }

        return res;

    }
};

根据元素维持单调队列

关键在于,当移除的元素等于队列头个元素的时候,那么就知道队列头个元素将要离开窗口范围,此时队列里面加入新进元素后的第二个元素就是窗口的最大值

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        // 单调队列,用元素来维持
        if(nums.size()<=k) {
            return {*max_element(nums.begin(),nums.end())};
        }
        if(k==1) {
            return nums;
        }

        deque<int> de;
        for(int i=0;i<k;i++) {
            while(!de.empty() && de.back()<nums[i] ) {
                de.pop_back();
            }
            de.push_back(nums[i]);
        }


        // 存储结果
        vector<int> res;

        res.push_back(de.front());

        for(int i=k;i<nums.size();i++) {
            if(nums[i-k]==de.front()) {
                de.pop_front();
            }

            while(!de.empty() && de.back()<nums[i]) {
                de.pop_back();
            }
            de.push_back(nums[i]);

            res.push_back(de.front());
        }

        return res;

    }
};
AI Agent开发第84课-paddleocr-vl全网唯一最全本地化布署教程 本文详解 PaddleOCR-VL 本地化布署全过程,指出为何在真实生产环境中 PaddleOCR-VL 更稳定、更易部署、更贴近工程落地。同时还会详细比较与 DeepSeek-OCR 的核心差异,为全网独家介绍paddleocr-vl的本地部署实战指南。 阅读详情

相关推荐

转子动力学 | 临界速度与稳定性分析

本文深入探讨了转子动力学中的核心问题——临界速度与稳定性分析。临界速度是旋转机械发生共振的危险转速,通过模态分析和坎贝尔图可进行预测。文章还剖析了油膜涡动等稳定性问题,并结合ANSYS仿真案例,详细阐述了从建模、分析到设计优化的完整工程实践流程,为旋转机械的可靠设计与安全运行提供关键指导。

weixin_29313239的博客 518

【LintCode】数组划分

描述给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。python codeclass Solution: """ @param nums: The integer array you should partition

tzshlyt的专栏 942

AI 代码生成工具的质量评估体系

基础需求层包括响应速度(Response Time)和界面友好性(UI Friendliness),期望需求层涵盖智能提示(Smart Suggestions)和个性化配置(Personalization),兴奋需求层则涉及多模态交互(Multimodal Interaction)和代码进化(Code Evolution)。在金融领域,代码审计合规性(Compliance Audit)权重应提升至40%,而在Web开发中,API兼容性(API Compatibility)的权重需达到35%。

2503_92418637的博客 3373

【单调队列】数据结构之单调队列详解

单调队列详解和习题引入

行码棋 1万+

TI Sitara PRU可编程实时单元:工业自动化中的硬实时协处理器解析

在嵌入式系统与工业自动化领域,实时性和确定性是核心需求。实时性指系统对外部事件做出响应的可预测时间,确定性则要求响应时间严格一致,不受其他任务干扰。其技术原理通常通过专用硬件或实时操作系统实现,例如采用独立于主CPU的协处理器来处理高精度时序任务。这种设计的技术价值在于,它能将主CPU从高实时性要求的任务中解放出来,专注于复杂业务逻辑,同时确保关键IO操作达到纳秒级延迟和极低抖动。应用场景广泛覆盖伺服电机控制、工业通信协议加速和多接口扩展等。本文聚焦的TI Sitara系列PRU(可编程实时单元),正是此类

weixin_42526068的博客 284

STM32CubeMX+FreeRTOS+CAN总线+传感器实战:多任务系统与通信融合开发详解

本文详细介绍了基于STM32CubeMX和FreeRTOS的CAN总线与光电传感器融合开发实战。通过多任务系统设计,实现传感器数据采集与CAN通信的协同工作,提供完整的配置例程和调试技巧,适用于工业控制与机器人感知等应用场景。

n2o3p4的博客 735

单调队列:实用而好写的数据结构

综上所述,单调队列代码简短而好写,能够解决的问题范围清晰,是一种很实用的数据结构。单调队列不常作为一个裸的知识点来单独考,而是常常与动态规划等问题结合在一起,用作优化时间复杂度。 单调队列可以优化的问题具有以下特点: 在一个区间 [l,r] 上求最值;区间左右端点 l,r 均单调不减/单调不增。 同时,类似滑动窗口这种 “(连续移动的)定长区间最值问题”是单调队列中考得最多的一种,也是必须掌握的一种。

Jerrycyx的博客 770

DA14531之如何Debug(在线调试、Jlink仿真、串口打印)

在线调试和串口打印调试。在线调试是Keil软件配合Jlink编译、烧录、仿真为一体的,其操作包括:运行、停止、打断点,单步运行等。而串口打印调试,只需打开相关配置,让arch_printf()函数正常输出串口数据。若想在初始化完成后打印arch_printf(“goto Loop\r\n”);波特率为115200,接收到串口消息goto Loop。连好线后,点击仿真按钮,在线Jlink调试。

hejinwu1314的博客 1792

【数据结构与算法】单调队列 | 单调栈

本篇博客主要讲解了两个非常实用的数据结构:单调队列和单调栈、用单调队列解决 LeetCode 中的滑动窗口最大值问题、用单调栈解决 LeetCode 中的每日问题和牛客网中的指标 A 的最大值问题等。

joy.728的博客 1332

SSE(Server-Sent Events)完整使用示例

本篇使用Node.js 作为服务端,在浏览器客户端演示SSE的完整实例和演示。实现了一个基于 Server-Sent Events (SSE) 的实时数据推送功能。

oscar999的专栏 750

最优控制 (Optimal Control) 算法详解及案例分析

最优控制是一种通过优化控制输入,使系统在满足约束条件的情况下达到最优性能的控制方法。其目标是最小化或最大化一个性能指标。

闲人编程的博客 2092

数据结构——单调队列

单调队列是一种维护滑动窗口内极值的高效数据结构,通过保持队列元素单调性,可在 O(n)时间内解决最大值/最小值问题,常用于优化动态规划及算法时间复杂度

2302_77572353的博客 861

Python爬虫实战:采集行业协会、研究机构等平台的政策文件列表与PDF链接批量收集系统,支持自动下载、分类归档和数据库管理(SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 640

数据结构之单调队列的实现

1 什么是单调队列 顾名思义,单调队列原则上也是一种队列,只不过在队列的基础上,有一些额外的功能是基本的队列所没有的。比如说每次出队的元素都比上一次的元素大或者小,这就是一种单调队列。 2 Java代码实现 import java.util.LinkedList; import java.util.Queue; /** * 单调队列 */ public class MonoQueue { private boolean up = true; private Queue<Integ

麦田里的守望者 752

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数据结构之单调队列

单调队列 代码 #include <bits/stdc++.h> using namespace std; class MonotonicQueue{ deque<int> data_; public: void push(int e){ while (!data_.empty() && e > data_.back()) data_.pop_back(); data_.push_back(e); return ; } void pop(v

Yanyu_123的博客 155

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据结构:单调栈和单调队列

单调队列和单调栈,有LeetCode典型例题哦~

m0_63997099的博客 2774

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数据结构:单调队列

2.检查队尾:如果队尾的元素>要添加的值,如果这个值加上去队列就不会保持单调性,所以要弹出队尾元素,对应t减一。1.检查队首:如果队首指向的下标<=i-k即队首元素已经跑出了k长度即[i-k+1,i]这个区间,那么就要将队首元素弹出来,对应将h加一。单调队列和单调栈很像,就是一个维护了单调性的队列数据结构,可以是单调递增的也可以是单调递减的。4大于队尾元素2,把2弹出,4小于8,直接将4加到8后面。注:队首指向0,队尾指向-1,默认队列里面没有元素。1.单调队列的队首和普通的队列一样,只能删除元素。

weixin_73048230的博客 185

算法模板:数据结构之单调队列【沈七】

⭐️讲解 数据结构中 重要应用 单调队列。

只想和你一起进步 773

【数据结构】单调数据结构之一:单调队列

零.前言 很明显的,本题是单调队列的模板题目。 为了方便我(和来赏光的 \(julao\) )今后复习,写一篇题解。 例题:luogu P1886 壹.简述 单调队列是一种数据结构(不知道算不算基础数据结构) 它满足一下性质: 单调队列中的数是满足单调递增/递减/或是其他的性质 单调队列中的数的下标是单调递增的(这也是下面的几位 \(julao\) 将单调队列与优先队列混为一谈的错误之...

weixin_30851409的博客 197

「数据结构详解·十」双端队列 & 单调队列的初步

双端队列详解 & 单调队列的初步详解

Leo_Chenjy的博客 715

(数据结构)单调队列

简介 单调队列,顾名思义,就是内部元素保持单调性的数据结构,同时又有着类似队列的尾进头出。 基本思想 保持队列最基本的操作(FIFO),但为了维护单调性,在入队的时候需要从尾部开始判断大小关系,将不符合的元素从尾部弹出队列,并将最新元素补充在尾部。 取最值即取头部值,在此之前需要判断该值是否在有效范围内,若否,不断从头部弹出直至有效最值出现(注意:此处并不会出现队列弹空的情况)。 例题 ...

weixin_30814319的博客 106

c++单调数据结构————单调栈,单调队列

本文介绍了单调栈和单调队列两种数据结构及其应用。单调栈保持元素单调性,可用于求解左右第一个更大/更小元素的位置,如百亿富翁问题中求解楼房左右第一个更高楼栋。单调队列维护滑动窗口的最值,如分蛋糕问题中统计满足高度差条件的连续蛋糕序列概率。两题均来自蓝桥杯真题,通过详细代码解析展示了数据结构的具体实现与应用场景。

qizhiburce的博客 1057

python数据结构——单调栈和单调队列

单调栈 数据结构栈遵循先进后出的原则,在python中,利用list就可以实现栈的功能 stack = [] stack.append(1) stack.append(2) print(stack.pop()) #2 单调栈遵循单调增或者单调减的原则,用于处理某些特别的任务,也就是常说的next greater element的问题。 class MStack: def __init__(self): self.stack = [] def push(self, value): while

学习笔记 1831

数据结构之单调队列与单调栈

数据结构之单调队列与单调栈 目录 一:单调队列 1:单调队列的概念 2:单调队列的模拟 3:单调队列的实现 4.单调队列的应用 holiday 5.补充与说明 单调队列例题: 二:单调栈 1.单调栈的基本概念与实现 2.单调栈的例题 一:单调队列 我们还是先放上一道题 洛谷P1886 滑动窗口 题目描述 有一个长为n的序列a,以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值...

jwg2732的专栏 664

数据结构:单调栈、单调队列

单调队列和单调栈是一种求最值的高效的数据结构,其中形式上类似单调函数。

2301_81454749的博客 1064
上一篇: C++ 优先队列
下一篇: C++之------------析构函数
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值