算法模板:数据结构之单调队列

简介: 算法模板:数据结构之单调队列

单调队列

单调队列:就是队列内元素满足单调性的队列结构。


且为了满足队列内元素的单调性,队尾也可弹出元素。此处的单调性分为单调递增与单调递减。


通过 单调队列 我们可以解决 经典问题 ---- 滑动窗口 。


滑动窗口

给定一个大小为 n≤106 的数组。 有一个大小为 k的滑动窗口,它从数组的最左边移动到最右边。


你只能在窗口中看到 k个数字。 每次滑动窗口向右移动一个位置。


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


窗口位置 最小值 最大值
[1 3 -1] -3 5 3 6 7 -1 3
1 [3 -1 -3] 5 3 6 7 -3 3
1 3 [-1 -3 5] 3 6 7 -3 5
1 3 -1 [-3 5 3] 6 7 -3 5
1 3 -1 -3 [5 3 6] 7 3 6
1 3 -1 -3 5 [3 6 7] 3 7


你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。


题解部分:


用单调队列来维护整个窗口,更新队列元素时当队列内元素超过窗口大小时,队头出队


怎么检测队列内元素个数超过窗口大小呢?


当队头储存下标小于的更新点的下标减去滑动窗口的大小 + 1 时,


说明队列内元素已超过窗口大小,直接使队头出队就行。


优化:更新队列时当发现更新的直要小于等于此时的队尾的元素时,删掉队尾,


因为因为要求的是滑动窗口内的最小值,所以如果更新的值比队内的值还小的话,那队尾的值肯定不是答案


所以最后每个滑动窗口都会有且仅有一个最小值在队列里面


直接通过队列储存的下标输出即可


#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N],q[N];
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i = 0 ; i < n ; i ++)
    cin>>a[i];
    int hh=0,tt=-1;
    for(int i = 0 ; i < n ; i ++)
    {
        if(hh<=tt&&q[hh]<i-k+1)
        hh++;
        while(hh<=tt&&a[q[tt]]>=a[i])tt--;
        q[++tt]=i;
        if(i+1>=k)cout<<a[q[hh]]<<" ";
    }
     hh=0,tt=-1;
     puts("");
    for(int i = 0 ; i < n ;i ++)
    {
        if(hh<=tt&&q[hh]< i - k + 1 )
        hh++;
        while(hh<=tt&&a[q[tt]]<=a[i])tt--;
        q[++tt]=i;
        if(i+1>=k)cout<<a[q[hh]]<<" ";
    }
    return 0;
}


完结散花

ok以上就是对 数据结构之单调队列 的全部讲解啦,很感谢你能看到这儿。如果有遗漏、错误或者有更加通俗易懂的讲解,欢迎小伙伴私信我,我后期再补充完善。

相关文章
|
1月前
|
算法
【算法】前缀和——二维前缀和模板题
【算法】前缀和——二维前缀和模板题
|
3月前
|
存储 算法
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
27 0
|
1月前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
40 2
|
2月前
|
存储 算法 索引
算法与数据结构
算法与数据结构
37 8
|
2月前
|
机器学习/深度学习 存储 算法
【数据结构】算法的复杂度
算法的时间复杂度和空间复杂度
50 1
【数据结构】算法的复杂度
|
1月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
1月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
1月前
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势
|
2月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
26 1
|
3月前
|
算法 分布式数据库
【数据结构和算法】--- 二叉树(5)--二叉树OJ题
【数据结构和算法】--- 二叉树(5)--二叉树OJ题
31 1