#include <iostream>
#include <deque>
using namespace std;
const int N = 1000000;
int n,k;
//存储下标
deque<int> min_v, max_v;
int a[N + 10];
int big[N+10];
int small[N + 10];
int arr = 1;
void input() {
cin >> n>>k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
}
void slidwindow() {
for (int i = 1; i <=n; i++)
{
//如果一直都是单调的,队列会无限长,长度大于我们的窗口长度,第一个元素当然不是我们想要的,因为根本就不在窗口里
//我们要保持队列长度为窗口长度
if (min_v.size() && k<=i-min_v.front()) {
min_v.pop_front();
}
if (max_v.size() && k <= i - max_v.front()) {
max_v.pop_front();
}
//要形成单调队列,需要一个法则
while(min_v.size() && a[min_v.back()]>=a[i]) {
min_v.pop_back();
}
while (max_v.size() && a[max_v.back()] <= a[i]) {
max_v.pop_back();
}
min_v.push_back(i);
max_v.push_back(i);
if (i>=k) {
big[arr] = a[max_v.front()];
small[arr] = a[min_v.front()];
arr++;
}
}
}
void output() {
for (int i = 1; i <arr; i++)
{
cout << small[i] << " ";
}
cout << endl;
for (int i = 1; i < arr; i++)
{
cout << big[i] << " ";
}
}
int main() {
input();
slidwindow();
output();
return 0;
}
单调队列解滑动窗口-C++实现
最新推荐文章于 2024-03-02 14:44:26 发布