//滑动窗口
#include<iostream>
#include<cstdio>
using namespace std;
int n,k,hea,tai;
int num[1000005],que[1000005],orde[1000005];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>num[i];
hea=0,tai=0;
for(int i=1;i<=n;i++)
{
if(orde[hea]<i-k+1)
hea++;
tai++;
que[tai]=num[i];
orde[tai]=i;
int te=1;
while(que[tai]<=que[tai-te]&&tai-te>=hea)
te++;
que[tai-te+1]=que[tai];
orde[tai-te+1]=orde[tai];
tai=tai-te+1;
if(i>=k)
cout<<que[hea]<<" ";
}
cout<<endl;
hea=0,tai=0;
for(int i=1;i<=n;i++)
{
if(orde[hea]<i-k+1)
hea++;
tai++;
que[tai]=num[i];
orde[tai]=i;
int te=1;
while(que[tai]>=que[tai-te]&&tai-te>=hea)
te++;
que[tai-te+1]=que[tai];
orde[tai-te+1]=orde[tai];
tai=tai-te+1;
if(i>=k)
cout<<que[hea]<<" ";
}
return 0;
}
本文介绍了一种使用滑动窗口算法解决数据序列中最大或最小值查找问题的方法。通过两个循环遍历输入序列,维护一个有序队列来快速找到窗口内的最大或最小元素。该算法适用于需要实时更新窗口内极值的应用场景。
797

被折叠的 条评论
为什么被折叠?



