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