有一个长为 n 的序列 a,以及一个大小为 k 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。
例如:
The array is [1,3,-1,-3,5,3,6,7], and k = 3k=3。
输入格式
输入一共有两行,第一行有两个正整数 n,k。 第二行 n 个整数,表示序列 a
输出格式
输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值
单调队列,在队列中二个体不相互影响时,却相互移动求值,一般求最小值或最大值。
#include<bits/stdc++.h>
using namespace std;
const int N = 1000005;
int a[N];
deque<int> q;
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
while (!q.empty() && a[q.back()] > a[i]) q.pop_back(); // 单调递减队列
q.push_back(i);
if (i >= m) {
while (!q.empty() && q.front() <= i - m) {
q.pop_front();//删头
}
printf("%d ", a[q.front()]);
}
}
printf("\n");
while (!q.empty()) q.pop_front();
for (int i = 1; i <= n; i++) {
while (!q.empty() && a[q.back()] < a[i]) {
q.pop_back();
}
q.push_back(i);
if (i >= m) {
while (!q.empty() && q.front() <= i - m) {
q.pop_front();
}
printf("%d ", a[q.front()]);
}
}
return 0;
}