AcWing 154. 滑动窗口
给定一个大小为n≤106
的数组。
有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。
您只能在窗口中看到k个数字。
每次滑动窗口向右移动一个位置。
您的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。
#include<bits/stdc++.h> using namespace std; const int N=1000010; int a[N],b[N],k,n,x; int main() { cin>>n>>k; for(int i=1;i<=n;i++)scanf("%d",&a[i]); int l=1,r=0; for(int i=1;i<=n;i++) { while(l<=r&&i-b[l]+1>k)l++; while(l<=r&&a[b[r]]>=a[i])r--; b[++r]=i; if(i>=k)printf("%d ",a[b[l]]); } puts(""); l=1,r=0; for(int i=1;i<=n;i++) { while(l<=r&&i-b[l]+1>k)l++; while(l<=r&&a[b[r]]<=a[i])r--; b[++r]=i; if(i>=k)printf("%d ",a[b[l]]); } return 0; }