- 编程
单调队列题解
- 2023-3-25 15:53:23 @
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int xiao[N];//存储的是下标
int l = 0,r = 0;
int main(){
int n , k;
scanf("%d %d" , &n , &k);
//先接收好元素
for(int i = 0 ; i < n ; i ++){
scanf("%d" , &a[i]);
}
//求最小值
//维护好一个单调递增的队列,永远保证队列是单调递增
//(左侧是最小的,右侧是最大的,并且右侧是当前滑动窗口的最右侧元素
for(int i = 0; i < n ; i ++){
//判断队头是否出窗口了
if(l <= r && xiao[l] < i - k + 1)
l ++;
//维护单调队列
while(l <= r && a[i] <= a[xiao[r]])
r--;
xiao[++r] = i;//将当前元素的下表插入到队列的最后
if(i >= k - 1){//从第k个开始才需要开始打印
printf("%d " , a[xiao[l]]);//队列的第一个元素就是当前滑动窗口的最小值
}
}
cout << endl;
l = r = 0;
//求最小值
//维护好一个单调递增的队列,永远保证队列是单调递增
//(左侧是最小的,右侧是最大的,并且右侧是当前滑动窗口的最右侧元素
for(int i = 0; i < n ; i ++){
//判断队头是否出窗口了
if(l <= r && xiao[l] < i - k + 1)
l ++;
//维护单调队列
while(l <= r && a[i] >= a[xiao[r]])
r--;
xiao[++r] = i;//将当前元素的下表插入到队列的最后
if(i >= k - 1){//从第k个开始才需要开始打印
printf("%d " , a[xiao[l]]);//队列的第一个元素就是当前滑动窗口的最小值
}
}
return 0;
}
0 条评论
目前还没有评论...