数据结构——单调栈&单调队列(解决滑动窗口问题)

Posted flydoggie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构——单调栈&单调队列(解决滑动窗口问题)相关的知识,希望对你有一定的参考价值。

技术图片

 

 

 单调队列解答:

/*******************
单调队列!=优先队列
单调队列是为了保证队列内的元素具有单调性,在保持了元素原本顺序的同时,对元素进行了过滤,舍弃了会影响单调性的元素
而优先队列本质上还是个队列
不会舍弃任何元素,每个元素都在队列之中,但是在队列中的位置由优先队列定义的优先级来确定,损失了原数组中的数据相对位置关系。
所以很显然,单调队列是解决:寻找在某元素左侧区间或者右侧区间的最值问题,
而优先队列的应用是寻找整个区间内的最高优先级别的内容。
/*******************
#include<iostream> using namespace std; const int N = 1000010; int n, m ,hh , tt; int a[N]; int q[N]; int main(){ scanf("%d%d",&n,&m); for(int i = 0 ; i < n ; i ++) scanf("%d",&a[i]); hh = 0;tt = -1; //单调递增序列 for(int i = 0 ; i < n ; i ++){ //滑动窗口内数据调整 if( hh<=tt && q[hh] < i+1-m ) hh++; while( hh <= tt && a[q[tt]] >= a[i] ){ tt--; } q[ ++tt ] = i; if( i >= m - 1 ) printf("%d ",a[q[hh]]); } puts(""); hh = 0;tt = -1; //单调递减序列 for(int i = 0 ; i < n ;i ++){ //调整滑动窗口内的数据 if(hh <= tt && q[hh] < i+1-m){hh++;} while(hh <= tt && a[q[tt]] <= a[i] ) tt--; q[++tt] = i; if(i >= m-1) printf("%d ",a[q[hh]]); } puts(""); return 0; }

技术图片

 

 

//单调栈,类似单调队列,对不满足单调性的数据进行筛选确保栈内元素单调
#include<iostream>
using namespace std;
const int N = 100010;
int n,m;
int st[N],tt;

int main(){
    cin>>n;
    int x;
    for(int i = 0 ; i < n ;i ++){
        cin>>x;
        while( tt > 0 && st[tt]>=x ) tt--;
        if(tt==0){cout<<-1<<" ";}
        else{
            cout<<st[tt]<<" ";
        }
        st[++tt] = x;
    }
    
    
    
    return 0;
}

 

以上是关于数据结构——单调栈&单调队列(解决滑动窗口问题)的主要内容,如果未能解决你的问题,请参考以下文章

单调队列/单调栈入门详解+题目推荐

浅谈单调队列:死海不是海,单调队列不是队列

单调栈&单调队列

面试常考算法题(考察单调队列)--滑动窗口的最大值

leetcode 239. 滑动窗口最大值(单调队列)

单调队列