单调队列:
本题的目的是实现一个单调队列,递减或递增,该题为递减
需要实现单调队列的三个部分:
(1) 出列,如果对头元素为当前元素则出列(目的是配合窗口的长度,如果队列中的长度超过了窗口的长度,则表名对头元素为窗口外的元素,需要出列)
(2) 入列,入列时首先应该将小于该元素的队尾元素全部去除,如果队尾中含有一个小于该元素的元素,则队列不再单调。
(3) 获取队列中的最大,最小值:该题获取最大值,由于单调递减,直接返回对头元素即可。
// 单调队列的本质是维持一个单调递减的队列
class MyQueue{
public:
deque<int> que; // 使用deque实现单调队列
/*元素出栈*/ // 当超过元素长度时,出列对头元素
void pop(int val){
if(!que.empty()&&val==que.front()){
que.pop_front();
}
}
/*入栈*/
void push(int val){
// 从对列尾部开始查找,小于当前元素的值全部出栈
while(!que.empty()&&val>que.back()){
que.pop_back();
}
// 当前元素入列
que.push_back(val);
}
/*获取队列元素中的最大值*/
int get_max(){
if(!que.empty()){
return que.front(); // 对头即为最大值,将对头元素出列
}
return -1;
}
};
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue que;
// 初始化队列元素
for(int i=0;i<k;i++){
que.push(nums[i]);
}
vector<int> ans; // 结果集
ans.emplace_back(que.get_max()); // 第一个k的最大值
for(int i=k;i<nums.size();i++){
// 将当前元素入列
que.push(nums[i]);
// 队首元素出列
que.pop(nums[i-k]);
// 获取队列中的最大值加入结果集
ans.push_back(que.get_max());
}
return ans;
}
};