单调队列
介绍
单调队列是一种特殊的数据结构。用来保持一个有序的队列。(无序的数据出队列)
通过适配 deque 而来。
API
template< class Type >
class monotonous_queue{
private:
deque<Type> data; //或者使用queue
public:
void push(Type); //尾部插入到单调队列中
void pop(Type); //从头部离开单调队列
Type max(); //返回单调队列中的最大元素
};
实现
template < class Type >
void monotonous_queue<Type>::push(Type n){
while(!data.empty() && n > data.back()) //保持单调队列特性,尾部比输入小的数值全部舍弃
data.pop_back();
data.push_back(n);
return;
}
template < class Type >
void monotonous_queue<Type>::pop(Type n){
if(!data.empty() && data.front() == n) //有可能在pop之前,就因为push()中的步骤pop掉
data.pop_front();
return;
}
template < class Type >
Type monotonous_queue<Type>::max(){
return data.front();
}
实际上单调队列这一种数据结构使用的是队列中的pop_back()
push_back()
pop_front()
back()
front()
方法,queue容器中不提供 pop_back()
方法,因此不可以通过适配 queue 而来。
Leetcode 239 滑动窗口最大值
难度:hard
链接:https://leetcode-cn.com/problems/sliding-window-maximum/
源码:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
monotonous_queue<int> mq;
vector<int> res;
for(int i=0;i<nums.size();++i){
if(i<k-1) //当前滑动窗口中的元素小于k个时,直接入队
mq.push(nums[i]);
else{ //入队后,输出窗口中的最大值给res,再弹出最前端为 nums[i-k+1] 的值,没有就不弹出
mq.push(nums[i]);
res.push_back(mq.max());
mq.pop(nums[i-k+1]);
}
}
return res;
}
时间复杂度:O(N)
空间复杂度:O(k)
学习自labuladong