单调队列,关键是要考虑到窗口和数组长度的关系——窗口的大小只有在 【1,数组大小】之间才会有答案。
#include <cstdio>
#include <vector>
class Solution {
private:
struct MyQue{
deque<int> que;
void pop(int val) {
if (!que.empty() && que.front() == val) {
que.pop_front();
}
}
void push(int val) {
while (!que.empty() && val > que.back()) {
que.pop_back();
}
que.push_back(val);
}
int front() {
return que.front();
}
void show() {
cout << "que:" << endl;
for (int i = 0; i < que.size(); i++) {
cout << que[i] << " ";
}
cout << endl;
}
};
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> ans;
if (size == 0 || size > num.size())
return ans;
MyQue que;
for (int i = 0; i < size; i++) {
que.push(num[i]);
}
ans.push_back(que.front());
for (int i = size; i < num.size(); i++) {
que.pop(num[i-size]);
que.push(num[i]);
ans.push_back(que.front());
}
return ans;
}
};