给出一列n个正整数,和一个大小为 k 的滑动窗口, 从左到右在数列中滑动这个窗口,找到数列中每个窗口内的最大值。 输入输出格式 输入格式 输入第一行为n和k,第二行为n个正整数。1<=k<=n<=100000,每个数都不超过100000。 输出格式 输出共n-k+1个数字,由空格隔开。
时间: 2024-02-28 10:56:57 浏览: 92
2017年软微软件工程新加机试1
以下是 C++ 的代码实现:
```cpp
#include <iostream>
#include <deque>
using namespace std;
const int N = 100010;
int n, k;
int a[N];
deque<int> q;
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) {
if (!q.empty() && i - q.front() + 1 > k) q.pop_front();
while (!q.empty() && a[q.back()] <= a[i]) q.pop_back();
q.push_back(i);
if (i >= k) cout << a[q.front()] << ' ';
}
return 0;
}
```
算法流程:
1. 读入数据,定义一个队列 q。
2. 从左到右遍历整个数列,当队列不为空且队首元素已经不在滑动窗口内时,将队首元素弹出。
3. 在遍历到每个元素时,将队列中所有比当前元素小的元素都弹出。
4. 将当前元素加入队列,并输出队首元素(即当前滑动窗口的最大值)。
时间复杂度:$O(n)$。
阅读全文