题目描述
给你一个长度为N的数组,一个长为K滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,如下表:
Window position Min value Max value
[1 3 -1] -3 5 3 6 7 -1 3
1 [3 -1 -3] 5 3 6 7 -3 3
1 3 [-1 -3 5] 3 6 7 -3 5
1 3 -1 [-3 5 3] 6 7 -3 5
1 3 -1 -3 [5 3 6] 7 3 6
1 3 -1 -3 5 [3 6 7] 3 7
你的任务是找出窗口在各位置时的Max value ,Min value。
输入格式
第一行n,k,第二行长度为n的数组
输出格式
第一行每个位置的Min value,第二行每个位置的Max value
输入样例
8 3
1 3 -1 -3 5 3 6 7
输出样例
-1 -3 -3 -3 3 3
3 3 5 5 6 7
限制与约定
20%:n≤500;
50%:n≤100000;
100%:n≤1000000;
时间限制:1s
空间限制:128MB
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxn = 1000000+10; int a[maxn],ans1[maxn],pos1[maxn],ans2[maxn],pos2[maxn]; int main() { int n,k; cin>>n>>k; for(int i=1;i<=n;i++) scanf("%d",&a[i]); int l1=0,r1=1,l2=0,r2=0; for(int i=1;i<=n;i++) { if(i-k+1>pos1[l1]) l1++; while(a[i]<a[ pos1[r1] ] && r1>=l1) r1--; pos1[++r1]=i; ans1[i]=a[pos1[l1]]; if(i-k+1>pos2[l2]) l2++; while(a[i]>a[ pos2[r2] ] && r2>=l2) r2--; pos2[++r2]=i; ans2[i]=a[pos2[l2]]; } for(int i=k;i<=n;i++) cout<<ans1[i]<<" "; cout<<endl; for(int i=k;i<=n;i++) cout<<ans2[i]<<" "; /* if(a[i]>a[Max[bx]]) { int j; for(j=bx;j>=0;j--) { if(a[i]<a[Max[j]) break; } bx=j+1; Max[bx]=i; } else Max[++bx]=a[i]; if(a[i]<Min[sx]) { int j; for(j=sx;j>=0;j--) { if(a[i]>Min[j]) break; } sx=j+1; Min[sx]=a[i]; } else Max[++sx]=a[i]; if(i>=k) { if(bx-k>0) amax[i]=Max[bx-k]; else amax[i]=Max[1]; if(sx-k>0) amin[i]=Min[sx-k]; else amin[i]=Min[1]; }*/ return 0; }