此题一开始就是卡在这么大的范围开不了这么大的空间的数组去做 ,然后用链式队列去做,我的class封装没学好,此题没能实现,最后是学长说1e6的数据也能过,可以用数组模拟队列的方法去做。
1.此题的滑块最重要的是下标值,所以出队进队保存的都是下标,并且此队列为单调队列。
如单调递增:新加元素一定要比队尾元素小,否则就将队尾元素出队,直到找到比自己大的,或者自己成为队首。
2.窗口是滑动的,所以每次都要判断队首的下标是否在窗口内,如不在就将队首出队。
附上代码
#include <iostream>
#include <algorithm>
using namespace std;
const int max_n=1e7;
int a[max_n];
int b[max_n];
int c[max_n];
int main()
{
int n,k;
cin >> n >> k;
for(int i=1;i<=n;i++)cin >> c[i];
int front=1;
int rear=0;
for(int i=1;i<=n;i++)
{
if(front<=rear&&a[front]<i-k+1)front++;
while(front<=rear&&c[i]<c[a[rear]])rear--;
a[++rear]=i;
if(i>k-1)cout << c[a[front]]<< ' ';
}
cout << endl;
front=1;
rear=0;
for(int i=1;i<=n;i++)
{
if(front<=rear&&a[front]<i-k+1)front++;
while(front<=rear&&c[i]>c[a[rear]])rear--;
a[++rear]=i;
if(i>k-1)cout << c[a[front]]<< ' ';
}
}