单调队列 滑动窗口(题目分析+C++完整代码)

ops/2025/2/4 15:42:54/

滑动窗口/单调队列

原题链接
AcWing 154. 滑动窗口

题目描述
给定一个数组。
有一个大小为 k的滑动窗口,它从数组的最左边移动到最右边。
你只能在窗口中看到 k个数字。
每次滑动窗口向右移动一个位置。

以下是一个例子:
该数组为 [1 3 -1 -3 5 3 6 7],k为 3。

窗口位置最小值最大值
[1 3 -1] -3 5 3 6 7-13
1 [3 -1 -3] 5 3 6 7-33
1 3 [-1 -3 5] 3 6 7-35
1 3 -1 [-3 5 3] 6 7-35
1 3 -1 -3 [5 3 6] 736
1 3 -1 -3 5 [3 6 7]37

任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。
题目分析
窗口可用队列来维护,队尾插入,队头弹出。
若求最小值,
如下列实例滑动窗口中,3<-3,-1<-3,且-3在后面,则只要-3在,则最小值一定是-3,3与-1的值一定不会被取到,
在这里插入图片描述
因此,提炼出,只要出现逆序对,即前面的数大于后面的数,则一定不会取到,则出队
由此,可知,队列中的数一定是单调递增的( 单调队列 )。
则,队头存储的即为当前的最小值

(可仔细看下方实例加深理解!!!)
在这里插入图片描述
求最大值同理。

完整代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1000010;
int n,k;
int a[N];  //存储原数组
int q[N];  //数组模拟队列,存储数组下标
int main(){scanf("%d%d",&n,&k);  //n为数组长度,k为滑动窗口长度for(int i=0;i<n;i++) scanf("%d",&a[i]);int hh=0,tt=-1;//最小值for(int i=0;i<n;i++){//hh<=tt表明队列不为空//判断队头是否已经滑出窗口//窗口最前端的数组下标大于队首,则队头数出列if(hh<=tt&&i-k+1>q[hh]) hh++;  //i-k+1(当前数组下标i-窗口长度k+1)为当前窗口最前端的数组下标//判断队尾数组是否大于当前数,若大于,出现逆序,则队尾的数弹出tt--while(hh<=tt&&a[q[tt]]>=a[i]) tt--;q[++tt]=i;  //当前数入队//前k-1个数时,不输出答案if(i>=k-1) printf("%d ",a[q[hh]]);}puts("");//最大值hh=0,tt=-1;for(int i=0;i<n;i++){//判断队头是否已经滑出窗口//窗口最前端的数组下标大于队首,则队头数出列if(hh<=tt&&i-k+1>q[hh]) hh++;  //i-k+1(当前数组下标i-窗口长度k+1)为当前窗口最前端的数组下标//判断队尾数组是否小于当前数,若小于,出现逆序,则队尾的数弹出tt--while(hh<=tt&&a[q[tt]]<=a[i]) tt--;q[++tt]=i;  //当前数入队//前k-1个数时,不输出答案if(i>=k-1) printf("%d ",a[q[hh]]);}}

http://www.ppmy.cn/ops/155600.html

相关文章

吉首市城区地图政府附近1公里范围高清矢量pdf\cdr\ai内容测评

吉首市城区地图以市政府中心附近1公里范围高清矢量pdf\cdr\ai(2021年详细&#xff09;&#xff0c;可以用cdr&#xff0c;ai软件打开编辑文字内容&#xff0c;放大。

虚幻基础17:动画层接口

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 animation layer interface animation layer interface 动画层接口&#xff1a;动画图表的集。仅有名字。 添加到动画蓝图中&#xff0c;由动画蓝图实现动画图表。

C++ Primer 自定义数据结构

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

利用Python高效处理大规模词汇数据

在本篇博客中&#xff0c;我们将探讨如何使用Python及其强大的库来处理和分析大规模的词汇数据。我们将介绍如何从多个.pkl文件中读取数据&#xff0c;并应用一系列算法来筛选和扩展一个核心词汇列表。这个过程涉及到使用Pandas、Polars以及tqdm等库来实现高效的数据处理。 引…

Python安居客二手小区数据爬取(2025年)

目录 2025年安居客二手小区数据爬取观察目标网页观察详情页数据准备工作&#xff1a;安装装备就像打游戏代码详解&#xff1a;每行代码都是你的小兵完整代码大放送爬取结果 2025年安居客二手小区数据爬取 这段时间需要爬取安居客二手小区数据&#xff0c;看了一下相关教程基本…

【LeetCode 刷题】回溯算法(4)-排列问题

此博客为《代码随想录》二叉树章节的学习笔记&#xff0c;主要内容为回溯算法排列问题相关的题目解析。 文章目录 46.全排列47.全排列 II 46.全排列 题目链接 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:res, path [], []used [0] * len(n…

1111111111

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

[Linux]如何將腳本(shell script)轉換到系統管理服務器(systemd service)來運行?

[InfluxDB]Monitor Tem. and Volt of RaspberryPi and Send Message by Line Notify 在Linux中&#xff0c;shell腳本(shell script)常用於運行各種自動化的流程&#xff0c;包含API串接&#xff0c;設置和啟動應用服務等等&#xff0c;腳本語法也相對易學易讀&#xff0c;因此…