单调队列总结

单调队列的介绍

由于现在我也没接触过正经的单调队列的定义,因而引申为介绍,

单调队列,类似与单调栈,存储在单调队列里面的元素理应都是单调的,单调队列的基础使用deque(双端队列)去实现的,因而我们的队头和队尾都可以去实现插入和删除,因而更方便去实现单调队列的功能

适用问题场景

适用于去求一个区间里面的极值(极大值或者极小值)
 

单调队列的应用

P1886 滑动窗口 /【模板】单调队列

题意:给你一个长度为n的序列,告诉你窗口的长度为k,然后问你滑动窗口中每次出现的最小值和最大值是什么

思路:很经典的一道单调队列题目,我们可以 用单调队列去实现滑动窗口,输出每次的到的结果,最小值或者最大值,既然要先求最小值,那么我们就用一个单调递减队列,先确定队头元素是否小于窗口覆盖范围,要是小于窗口覆盖范围,就先将队头元素弹出,然后比较加入元素比队尾元素小的,就将队尾元素弹出

然后再输出最大值,将队列中的元素全部清空,然后变成单调递增栈,还是先确定队头元素是否滑出窗口,如果滑出窗口范围就直接弹出,然后比较要加进来的元素和队尾元素的大小,如果大于队尾元素,那么就将队尾元素弹出

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
int a[1000005];
deque<int> que;//存储下标的双端队列signed main()
{cin>>n>>k;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<=n;i++)//先输出最小值 {if(!que.empty()&&i-k+1>que.front()){que.pop_front();}while(!que.empty()&&a[i]<a[que.back()]){que.pop_back();}que.push_back(i);if(i>=k){cout<<a[que.front()]<<" ";}}cout<<"\n";que.clear();for(int i=1;i<=n;i++){if(!que.empty()&&i-k+1>que.front()){que.pop_front();}while(!que.empty()&&a[i]>a[que.back()]){que.pop_back();}que.push_back(i);if(i>=k){cout<<a[que.front()]<<" ";}}cout<<"\n";return 0;
} 

1438. 绝对差不超过限制的最长连续子数组

题意:就是说样例会给你一个数组,和一个限制数limit,一个区间里面的最大值和最小值的差应当小于这个限制数

用两个单调队列,一个单调队列用于存储最小值,一个单调队列用来存储最大值,最后去判断极差是否在这个限制数之内,如果处于这个限制数之内,则可以进行最大长度的更新

思路:用一个单调递增队列去记录这个区间内的最大值,用一个单调递减队列去记录区间内的最小值,然后利用滑动窗口的思想,设置一个左端的L和右端R,去遍历窗口的情况,窗口一开始应该先移动右指针,不断去扩大窗口内的元素数量知道窗口内的最大值和最小值的差值超出了限制数,一旦超出限制数就要去增加左指针缩小窗口范围

class Solution {
public:int longestSubarray(vector<int>& nums, int limit) {deque<int>qmin,qmax;int ans=0;//用于更新最大长度int l=0,r=0;while(r<nums.size()){while(!qmin.empty()&&nums[r]<nums[qmin.back()])qmin.pop_back();while(!qmax.empty()&&nums[r]>nums[qmax.back()])qmax.pop_back();qmin.push_back(r);qmax.push_back(r);while(!qmax.empty()&&!qmin.empty()&&nums[qmax.front()]-nums[qmin.front()]>limit){if(nums[l]==nums[qmax.front()])qmax.pop_front();if(nums[l]==nums[qmin.front()])qmin.pop_front();l++;}ans=max(ans,r-l+1);r++;}return ans;}
};

单调队列初总结

其实单调队列就是用于求一个区间的极值的一种方法,我们可以利用单调队列去处理某一个区间里面的极值问题,然后就会衍生出一种滑动窗口的思想

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

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

相关文章

【总线】AXI总线:FPGA设计中的通信骨干

目录 AXI4&#xff1a;高性能地址映射通信的基石 AXI4-Lite&#xff1a;轻量级但功能强大的通信接口 AXI4-Stream&#xff1a;高速流数据传输的利器 结语&#xff1a;AXI总线在FPGA设计中的重要性 大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计…

FlowUs息流开启知识管理的新纪元|FlowUs息流公开知识库

在信息爆炸的时代&#xff0c;如何高效地管理和利用知识成为了一个挑战。FlowUs知识库以其超巨的性价比&#xff0c;为用户带来了全新的解决方案。它不仅仅是一个存储信息的工具&#xff0c;更是一个能够激发创造力和提高生产力的平台。 性价比之选 FlowUs以其合理的价格&…

redis数据结构—哈希表

我在“redis存储结构”这篇文章中介绍了redis存储数据的方式——字典&#xff0c;redis的字典使用高效的hash table实现&#xff0c;这里详细介绍redis中哈希表的实现和工作原理 redis的哈希表结构 typedef struct dictht {//哈希表数组dictEntry **table;//哈希表大小unsign…

ChromeDriver新手教程:一步步指导Chrome 114到127版本的驱动安装

114之前版本下载链接在这里 ​​​​​​125以后版本下载链接在此&#xff0c;只有后面status是绿色对勾的才可以下载&#xff0c;驱动大版本一致就可以使用&#xff0c;不需版本号一模一样&#xff1b;下载所需版本只需点击对应的版本名称即可跳转到对应版本的下载位置。 以…

学习笔记——网络管理与运维——SNMP(基本配置)

四、SNMP基本配置 1、SNMP配置举例 整个华为数通学习笔记系列中&#xff0c;本人是以网络视频与网络文章的方式自学的&#xff0c;并按自己理解的方式总结了学习笔记&#xff0c;某些笔记段落中可能有部分文字或图片与网络中有雷同&#xff0c;并非抄袭。完处于学习态度&#x…

windows系统把桌面的文件重定向到电脑的其他分区盘

当我们使用windows系统的电脑时&#xff0c;很喜欢把一些常用的文件放到桌面上。而桌面上的文件默认都是设定在C盘下的。时间长了&#xff0c;C盘容易爆红(空间不足)。下面我将介绍一种比较简单快捷的办法来解决这种问题--就是把桌面的文件重定向到电脑的其他分区盘。 首先我们…

[蓝桥杯真题]买二赠一

蓝桥杯真题;买二赠一&#xff0c;要求赠的一价格不能超过买的两者之间最小价格的二分之一 看到这个题的时候我信心满满的一顿操作猛如虎&#xff0c;全部写出来的时候内心想着&#xff0c;稳了&#xff01;这次绝对稳了&#xff01;然而。。。答案错误。。。 我只能去看了一下…

2024年春季学期《算法分析与设计》练习15

问题 A: 简单递归求和 题目描述 使用递归编写一个程序求如下表达式前n项的计算结果&#xff1a; (n<100) 1 - 3 5 - 7 9 - 11 ...... 输入n&#xff0c;输出表达式的计算结果。 输入 多组输入&#xff0c;每组输入一个n&#xff0c;n<100。 输出 输出表达式的计…

使用dev_dbg调试

首先内核要使能两个配置才可以使用。一般内核都是打开的。 CONFIG_DEBUG_FSy CONFIG_DYNAMIC_DEBUGy 当编译选项CONFIG_DYNAMIC_DEBUG打开的时候&#xff0c;在编译阶段&#xff0c;kernel会把所有使用dev_dbg()的信息记录在一个table中&#xff0c;这些信息我们可以从/sys/k…

android 一个manifest 可以有 多个 hal 吗 ?

是的&#xff0c;在Android系统中&#xff0c;一个manifest文件理论上可以声明多个HAL&#xff08;Hardware Abstraction Layer&#xff0c;硬件抽象层&#xff09;实现。这意味着&#xff0c;如果你的应用或模块需要与多种不同的硬件组件交互&#xff0c;你可以在同一个manife…

xftp无法删除目录

遇到很奇怪的事&#xff0c; 我通过xftp软件删除服务器上的一个文件夹&#xff0c;但是怎么都删除不掉&#xff0c;而且在xftp上看到的是存在两个同名的文件夹&#xff0c;真的是完全同名&#xff08;仅通过xftp上看&#xff09;。然后我觉得好奇怪&#xff0c;就在终端上使用l…

谷歌发布Infini-Transformer模型—无限注意力机制长度,超越极限

Transformer 是一种基于自注意力机制的深度学习模型&#xff0c;最初应用于自然语言处理领域&#xff0c;现已扩展到图像、音频等多个领域。与传统的循环神经网络 (RNN) 不同&#xff0c;Transformer 不依赖于顺序数据处理&#xff0c;能够并行计算&#xff0c;从而显著提高效率…

关注开源大模型,深度学习+人工智能领域热门项目

标题&#xff1a;开源大模型  项目名称&#xff1a;开源大模型  项目地址&#xff1a;[https://gitcode.com/2noise/ChatTTS ](https://gitcode.com/2noise/ChatTTS%E3%80%82)  随着开源程序的发展&#xff0c;越来越多的程序员开始关注并加入开源大模型的行列。对于开源…

javascript截取video视频第一帧作为封面方案

写在前边:因为项目是用vue.js框架实现,所以以下代码是vue.js语法。 首先,看一下Dom元素 ~~~awk <video@loadeddata="createPreImg($event)" // loadeddata事件表示media中的首帧已经加载class="content-video":src="item.videoUrl" // 视…

Havoc工具

Team端 客户端 打开后需要生成监听器和agent 监听 生成payload 最后上线 HTTPS流量 HTTP流量 心跳

力扣454题解:四数相加(java实现简易)

力扣454题解&#xff1a;四数相加 引言 LeetCode是一个流行的在线判题平台&#xff0c;它提供了大量的算法题目供程序员练习和挑战。第454题“四数相加II”是一个中等难度的题目&#xff0c;要求找出所有两数之和等于特定值的四元组。本文将详细介绍如何使用Java解决这个问题…

代码随想录打卡第十二天补

代码随想录打卡第十二天补 第五章 栈和队列 part2 150. 逆波兰表达式求值 本题不难&#xff0c;但第一次做的话&#xff0c;会很难想到&#xff0c;所以先看视频&#xff0c;了解思路再去做题 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0150.%E9%8…

【ARMv8/ARMv9 硬件加速系列 3.3 -- SVE LD2D 和 ST2D 使用介绍】

文章目录 SVE 多向量操作LD2D(加载)LD2D 操作说明LD2D 使用举例ST2D(存储)ST2D 使用举例ST2D 存储示例代码ld2d 和 st2d 小结SVE 多向量操作 在ARMv8/9的SVE (Scalable Vector Extension) 指令集中,st2d和ld2d指令用于向量化的存储和加载操作,具体地,它们允许同时对两个…

Mysql中常用的sql语句(适合萌新学习)

本人在学习mysql的过程中&#xff0c;踩过很多坑&#xff0c;走过很多弯路&#xff0c;这是我个人总结的一些常用的知识点&#xff0c;希望可以对大家有所帮助&#xff0c;与君共勉&#xff01; 1.查看 查看行&#xff1a; select * from <tables>; sel…

物联边缘网关如何助力工厂实现智能化生产?以某智能制造工厂为例-天拓四方

随着工业4.0的深入推进&#xff0c;智能制造工厂成为了工业发展的重要方向。在这个背景下&#xff0c;物联边缘网关以其独特的优势在智能制造工厂中发挥着越来越重要的作用。以下将通过一个具体的智能制造工厂应用案例&#xff0c;来阐述物联边缘网关如何助力工厂实现智能化生产…