• 【单调队列】


    单调队列知识点

    相关例题

    在这里插入图片描述
    在这里插入图片描述

    核心概念

    • 什么是单调队列?
      简单来说,用双端队列deque去实现一个从左自右的递增队列,做法是每次从队尾插入元素的时候从队尾依次把比当前元素小的元素全部出队。以保证队列是一个递减的队列。
    • 单调队列的使用场景是什么?
      滑动窗口区间最值问题,配合单向队列使用。
    • 关键点?
      • 每次插入元素要注意依次删除队尾的小元素
      • 滑动窗口移动的时候最左侧的边界元素需要出队,这个时候辅助单向队列需要pop()如果pop()的元素和deque的首元素相同则deque也同样要出队。

    代码实现

    以下是Offer59题 ,学习方法和并查集一样,会用就能理解。注意脑海中建模单调队列的运行原理。

    class Solution {
    public:
        //monotonic queue
        deque dq;
        queue q;
    	void enqueue(int ele){
    		while(!dq.empty() && dq.back() < ele)
    			dq.pop_back();
    		dq.push_back(ele);
    		q.push(ele);
    	}
    	int max_value(){
    		return dq.front();
    	} 
    	void popque(){
    		int f=q.front();
    		q.pop();
    		if(f == dq.front())
    			dq.pop_front();
    	}
        vector maxSlidingWindow(vector& nums, int k) {
        	vector ans;
            for(int i = 0; i < nums.size() && i < k; ++i)
            	enqueue(nums[i]);
            if(k>=nums.size()){
            	int vx=max_value();
            	return vector{vx};
    		}
            ans.push_back(max_value());
            	
    		int pos = k;
    		for(;pos
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    Java数组的定义与使用(保姆级别详细)(一)
    LRU算法
    2022年申请牛剑入学的IB学霸们的成绩多高?
    Windows安装配置Vagrant
    项目管理软件dhtmlxGantt配置教程(十六):如何设置动态化比例
    10_libpcap以及libnet
    arm cortex-a9的qemu仿真与启动文件解释
    YOLO系列目标检测算法-YOLOv7
    【springboot日志】logback.xml常用配置详解
    Spring-JdbcTemplate环境搭配及基本功能
  • 原文地址:https://blog.csdn.net/qq_37225146/article/details/126604165