单调队列总结

news2024/11/24 2:48:08

单调队列的介绍

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

单调队列,类似与单调栈,存储在单调队列里面的元素理应都是单调的,单调队列的基础使用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.coloradmin.cn/o/1831959.html

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

相关文章

DY-34/60C电压继电器 带板前底座 约瑟JOSEF

系列型号&#xff1a; DY-32电压继电器&#xff1b;DY-36电压继电器&#xff1b; DY-33电压继电器&#xff1b;DY-37电压继电器&#xff1b; DY-34电压继电器&#xff1b;DY-38电压继电器&#xff1b; DY-31电压继电器&#xff1b;DY-35电压继电器&#xff1b; DY-32/60C电…

6.17作业

//主函数 #include "widget.h" #include "from.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();From f;QObject::connect(&w,&Widget::my_jump,&f,&From::jump_slot);…

如何下载mmwave_automotive_toolbox?

摘要&#xff1a;mmwave_automotive_toolbox已经没有下载连接了&#xff0c;因为它已经和radar_toolbox集成到一起了&#xff0c;本文介绍下载方法。 链接如下 Corner Radar Overview (ti.com) 本文发布的时间时2024年6月17日&#xff0c;如果上面这个链接已经无法访问&#…

如何监控员工浏览网址(有效方法分享)

在数字化办公日益普及的今天&#xff0c;合理监控员工浏览网址成为了企业管理中的一个重要议题。 这不仅关乎工作效率的提升&#xff0c;更涉及到企业信息安全与合规管理。 以下是一些有效监控员工浏览网址的方法分享&#xff0c;旨在帮助企业管理者在保障隐私的前提下&#x…

探索AI绘画工具的前沿:创新科技与艺术的无缝融合

在科技和艺术交织的时代&#xff0c;AI绘画工具以其独特的魅力引领着创作的新潮流。本文将带您深入了解AI绘画工具的前沿技术&#xff0c;并通过最新例子展示其实际应用和潜力。 AI绘画工具概述 AI绘画工具通过集成深度学习、自然语言处理等技术&#xff0c;实现了从文字描述…

在 Selenium 中更改 User-Agent | 步骤与最佳实践

在 Selenium 中更改 User Agent 是许多网页抓取任务中的关键步骤。它有助于将自动化脚本伪装成常规浏览器&#xff0c;从而避免被网站检测到。本指南将带您了解如何在 Selenium 中更改 Google Chrome 的 User Agent&#xff0c;并提供最佳实践以确保您的网页抓取任务顺利进行。…

Pikachu靶场--RCE

exec"ping" 输入IP地址查看页面反应 可以在IP地址的后面拼接我们想要执行的命令 127.0.0.1 & ipconfig 127.0.0.1 && type C:\Windows\win.ini 127.0.0.1 | systeminfo 127.0.0.1 && net user 命令连接符 &命令1和命令2正…

Windows环境部署MySQL_8.4.0 LTS的部署安装、验证连接以及卸载全过程实操手册

前言&#xff1a; 什么是 MySQL MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统&#xff0c;关系型数据库将数据保存在不同的表中&#xff0c;而不是将所有数据放在一个大仓库内&am…

DS1339C串行实时时钟-国产兼容RS4C1339

RS4C1339串行实时时钟是一种低功耗的时钟/日期设备&#xff0c;具有两个可编程的一天时间报警器和一个可编程方波输出。地址和数据通过2线双向总线串行传输。时钟/日期提供秒、分钟、小时、天、日期、月份和年份信息。对于少于31天的月份&#xff0c;月末的日期会自动调整&…

药品光照稳定性试验箱如何进行光强度的校准和验证?

药品光照稳定性试验箱是一种用于模拟不同光照条件下药品贮存和稳定性评价的设备&#xff0c;其精准的光强度控制和稳定性对药物质量的保证至关重要。为了确保光照稳定性试验箱的光强度控制精准可靠&#xff0c;以下将介绍光照稳定性试验箱如何进行光强度的校准和验证。 1、设备…

2024年最佳插电式混合动力电动汽车

对电动汽车充满好奇和环保意识的司机们还没有准备好跨入纯电动汽车&#xff0c;他们可以找到一个折衷方案&#xff0c;即插电式混合动力车。 在过去的16年里&#xff0c;我一直在把握汽车行业的脉搏。试驾数百辆汽车、电动汽车、插电式混合动力车&#xff0c;跟踪汽车行业的新闻…

从11个视角看全球Rust程序员1/4:深度解读JetBrains最新报告

讲动人的故事,写懂人的代码 五个月前,编程界的大佬JetBrains发布了他们的全球开发者年度报告。 小吾从这份报告中找出了下面11个关于全球程序员如何使用Rust的有趣的趋势,让你学习和使用Rust更轻松。 1 这两年有多少程序员在工作中使用了Rust? 2 全球程序员使用Rust有多…

示例:WPF中DataGrid设置多级分组样式

一、目的&#xff1a;应用CollectionViewSource和GroupStyle设置DataGrid多级分组样式 二、实现 一级分组效果如下 二级分组效果如下 三、环境 VS2022 四、示例 具体实现代码如下 <TabItem Header"DataGrid - 多级分组"><TabItem.Resources><Colle…

09-Spark架构

相比MapReduce僵化的Map与Reduce分阶段计算&#xff0c;Spark计算框架更有弹性和灵活性&#xff0c;运行性能更佳。 1 Spark的计算阶段 MapReduce一个应用一次只运行一个map和一个reduceSpark可根据应用复杂度&#xff0c;分割成更多的计算阶段&#xff08;stage&#xff09;…

电影《加菲猫家族》观后感

上周看了电影《加菲猫家族》&#xff0c;本片其中有很多明亮的画面&#xff0c;相关艳丽的色彩&#xff0c;充满温馨的场景&#xff0c;很符合加菲猫的一贯画风&#xff0c;即使反派出场时&#xff0c;带有阴暗的感觉&#xff0c;看起也不是特别吓人&#xff0c;比较欢乐气氛&a…

umijs脚手架

node 16.9.1 注意node版本的问题 node 18.20.0 这个问题其实是node与中端连接出错&#xff0c;无法初始化TTY&#xff08;终端设备&#xff09;&#xff0c;可以用cmd命令行来创建umi项目 nvm管理node https://github.com/coreybutler/nvm-windows/releases 这是nvm-window…

减肥药实质利好服装业:身材好了,更时尚了 1-5月份,新建商品房销售面积同比下降20.3%

减肥药实质利好服装业&#xff1a;身材好了&#xff0c;更时尚了 减肥成功的顾客纷纷瞄准性感look&#xff0c;不但促进了销售&#xff0c;还给服装品牌节省了成本&#xff0c;因为小尺寸的衣服使用的面料更少。大码女装&#xff0c;可能是下一个被 GLP-1减肥神药杀死的行业。…

无需配置MySQL,Navicat也有在线版了?

前言 随着互联网技术的飞速发展&#xff0c;远程办公和在线协作成为了新的趋势。为了满足这一需求&#xff0c;TitanIDE模板市场近日上线了Navicat模板&#xff0c;使得数据库管理变得更加便捷、高效。现在&#xff0c;用户只需在浏览器打开TitanIDE&#xff0c;即可轻松使用N…

柯桥外语学校考级英语-如何估算四六级的分数

四六级的题型分值占比&#xff0c;如果按照满分100分算&#xff0c;各部分分值如下&#xff1a; 写作部分为15分&#xff1b; 基本切题&#xff0c;文字勉强连贯&#xff0c;有相当多的语言错误&#xff0c;建议估8分。 如果思想没表达清楚&#xff0c;连贯性差&#xff0c;那…

软件安全测试和渗透测试的区别是什么?

在现今数字化时代&#xff0c;软件安全测试和渗透测试变得越来越重要。那么&#xff0c;软件安全测试和渗透测试到底是什么?它们之间有什么区别?又有什么作用呢?让我们一起来详细探究。 软件安全测试是一种专门用于评估软件系统在面对各种安全威胁时的强度和抵抗能力的测试…