class Solution {
private:
class Myqueue{
public:
//queue在没有指定容器的情况下,deque就是默认底层容器
//pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作
//push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止
deque<int> que; // 使用deque来实现单调队列
void pop(int value) {
if (!que.empty() && value == que.front()) {
que.pop_front();
}//不能使用while,只能用if判断,不然就会弹出和最大值相同的数
}
void push(int value) {
while (!que.empty() && value > que.back()) {
que.pop_back();
}
que.push_back(value);
}
int front() {
return que.front();
}
};
public:
//单调队列,保证队列是单调递增或者递减
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
Myqueue qu;//写法
vector<int> vec;
for (int i = 0; i < nums.size(); i++){
if (i >= k){
qu.pop(nums[i - k]); // 滑动窗口移除最前面元素
qu.push(nums[i]);
vec.push_back(qu.front());
}
else if (i < k){
qu.push(nums[i]);
}
if (i == k - 1){//第一次最大值
vec.push_back(qu.front());
}
}
return vec;
}
};