单调队列知识点
相关例题
核心概念
- 什么是单调队列?
简单来说,用双端队列deque去实现一个从左自右的递增队列,做法是每次从队尾插入元素的时候从队尾依次把比当前元素小的元素全部出队。以保证队列是一个递减的队列。 - 单调队列的使用场景是什么?
滑动窗口区间最值问题,配合单向队列使用。 - 关键点?
- 每次插入元素要注意依次删除队尾的小元素
- 滑动窗口移动的时候最左侧的边界元素需要出队,这个时候辅助单向队列需要pop()如果pop()的元素和deque的首元素相同则deque也同样要出队。
代码实现
以下是Offer59题 ,学习方法和并查集一样,会用就能理解。注意脑海中建模单调队列的运行原理。
class Solution {
public:
//monotonic queue
deque<int> dq;
queue<int> q;
void enqueue(int ele){
while(!dq.empty() && dq.back() < ele)
dq.pop_back();
dq.push_back(ele);
q.push(ele);
}
int max_value(){
return dq.front();
}
void popque(){
int f=q.front();
q.pop();
if(f == dq.front())
dq.pop_front();
}
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
for(int i = 0; i < nums.size() && i < k; ++i)
enqueue(nums[i]);
if(k>=nums.size()){
int vx=max_value();
return vector<int>{vx};
}
ans.push_back(max_value());
int pos = k;
for(;pos<nums.size();++pos){
popque();
enqueue(nums[pos]);
ans.push_back(max_value());
}
return ans;
}
};