栈与队列 Leetcode 239 滑动窗口最大值
要点:1.能想到单调队列,积累技巧;
class Solution{
public:
class My_Monotonous_Queue{
public:
deque<int> Mono_queue;
// 重写队列pop函数内部实现,移除队列最前方的值,如果队列最前方的值和要移除的数值相同则执行移除命令
void pop(int value){
if(!Mono_queue.empty() && Mono_queue.front() == value){
Mono_queue.pop_front();
}
}
// 重写队列push函数内部实现,添加元素到队列尾部,如果队列尾部值小于所要添加元素,则移除队列尾部元素直至队列尾部元素大于等于所要添加的元素值,之后添加元素值到队列尾部
void push(int value){
while(!Mono_queue.empty() && Mono_queue.back() < value){
Mono_queue.pop_back();
}
Mono_queue.push_back(value);
}
int front(){
return Mono_queue.front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums, int k){
My_Monotonous_Queue Mono_Q;
vector<int> res;
for(int i = 0; i < k; i++){
Mono_Q.push(nums[i]);
}
res.push_back(Mono_Q.front());
for(int i = k; i < nums.size(); i++){
Mono_Q.pop(nums[i-k]);
Mono_Q.push(nums[i]);
res.push_back(Mono_Q.front());
}
return res;
}
};