单调队列
单调队列
单调队列用来求某个固定大小的窗口内的最大值或者最小值问题。

输入样例:
8 3 1 3 -1 -3 5 3 6 7
期望输出:
-1 -3 -3 -3 3 3 3 3 5 5 6 7
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+9;
int n,k;
int a[N],q[N];
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int h=0,l=-1;
for(int i=0;i<n;i++)
{
//判断队头是不是在滑动窗口内
while(h<=l&&i-k+1> q[h]) h++;
//
while(h<=l&&a[q[l]]>=a[i]) l--;
q[++l]=i;
//输出
if(i>=k-1) printf("%d ",a[q[h]]);
}
for(int i=0;i<n;i++)
{
//判断队头是不是在滑动窗口内
while(h<=l&&i-k+1> q[h]) h++;
//
while(h<=l&&a[q[l]]<a[i]) l--;
q[++l]=i;
//输出
if(i>=k-1) printf("%d ",a[q[h]]);
}
}

浙公网安备 33010602011771号