//在平常算区间的最大值或最小值时,使用滑动窗口可以有效减少遍历次数
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int dp[N],q[N],n,k;
int main(){
cin>>n>>k;
int hh=0,ee=-1;;
for(int i=0;i<n;i++){
scanf("%d",&dp[i]);
}
for(int i=0;i<n;i++){
while(hh<=ee&&dp[q[ee]]>=dp[i]) ee--;//这里判断新增数和当前末尾数关系
q[++ee]=i;//插入
while(q[hh]<=i-k) hh++;//末尾超出区间长度便让尾指针前移
if(i>=k-1) cout<<dp[q[hh]]<<" ";//输出
}
cout<<endl;
hh=0,ee=-1;
for(int i=0;i<n;i++){
while(hh<=ee&&dp[q[ee]]<=dp[i]) ee--;
q[++ee]=i;
while(q[hh]<=i-k) hh++;
if(i>=k-1) cout<<dp[q[hh]]<<" ";
}
return 0;
}
滑动窗口模板
于 2023-11-06 12:46:31 首次发布