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

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

单调队列

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


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


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


滑动窗口

给定一个大小为 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月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
76 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
算法
【算法】前缀和——二维前缀和模板题
【算法】前缀和——二维前缀和模板题
|
1月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
27 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
1月前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
35 4
|
1月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
21 0
数据结构与算法学习十四:常用排序算法总结和对比
|
1月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
33 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
1月前
|
机器学习/深度学习 存储 算法
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
|
2月前
|
机器学习/深度学习 算法 Java
[算法与数据结构] 谈谈线性查找法~
该文章详细介绍了线性查找法的基本概念与实现方法,通过Java代码示例解释了如何在一个数组中查找特定元素,并分析了该算法的时间复杂度。
|
1月前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
1月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
22 0
下一篇
无影云桌面