题目链接:https://www.acwing.com/problem/content/156/
题目如下:
#include <iostream>
#include <deque>
using namespace std;
const int N=1000010;
int n,k;
int nums[N];
deque<int> que;
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>nums[i];
}
//求窗口为k中的最小值
for(int i=0;i<n;i++){
while(que.size() && que.front()<=i-k) que.pop_front();//当前窗口的区间为[i-k+1,i]
while(que.size() && nums[que.back()]>=nums[i]) que.pop_back();//将队列中比自己大的元素全部删除
que.push_back(i);//将元素放入队列中
if(i>=k-1) cout<<nums[que.front()]<<' ';//这里加判断主要用于第一个窗口取值的时机,队首即为答案
}
cout<<endl;
que.clear();//这里很重要,要清空队列内容
//求窗口为k中的最大值
for(int i=0;i<n;i++){
while(que.size() && que.front()<=i-k) que.pop_front();
while(que.size() && nums[que.back()]<=nums[i]) que.pop_back();
que.push_back(i);
if(i>=k-1) cout<<nums[que.front()]<<' ';
}
cout<<endl;
return 0;
}