题目描述
给出一个长度为 N� 的数组,一个长为 K� 的滑动窗口从最左移动到最右,每次窗口移动,如下图:
找出窗口在各个位置时的极大值和极小值。
输入
第一行两个数 N,K�,�。
第二行有 N� 个数,表示数组中的元素。
输出
输出两行,第一行为窗口在各个位置时的极小值,第二行为窗口在各个位置时的极大值。
样例输入
8 3
1 3 -1 -3 5 3 6 7
样例输出
-1 -3 -3 -3 3 3
3 3 5 5 6 7
#include <iostream>
#include <vector>
#include <set>
#include <stack>
#include <algorithm>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> arr;
for (int i = 0, a; i < n; i++) {
cin >> a;
arr.push_back(a);
}
deque<int> q;
for (int i = 0; i < n; i++) {
while (!q.empty() && arr[q.back()] > arr[i]) q.pop_back();
q.push_back(i);
if (i - q.front() == k) q.pop_front();
if (i + 1 < k) continue;
if (i >= k) cout << " ";
cout << arr[q.front()];
}
cout << endl;
while (!q.empty()) q.pop_back();
for (int i = 0; i < n; i++) {
while (!q.empty() && arr[q.back()] < arr[i]) q.pop_back();
q.push_back(i);
if (i - q.front() == k) q.pop_front();
if (i + 1 < k) continue;
if (i >= k) cout << " ";
cout << arr[q.front()];
}
return 0;
}