单调队列c++解决滑动窗口最大值问题
单调队列中的元素以单调递增或递减方式排列,可以解决leetcode239. 滑动窗口最大值。
这里单调队列使用了std::list即双端链表实现,队列中元素单调递减排列。
class MonotonicQueue{
public:
void push(int n){
// 将队列中小于n的元素全部删除
while(!mQueue.empty() && mQueue.back() < n){
mQueue.pop_back();
}
mQueue.push_back(n);
}
int max(){
return mQueue.front();
}
void pop(int n){
// 元素n可能在入队判断时已经删除了
if(n == mQueue.front()){
mQueue.pop_front();
}
}
private:
std::list<int> mQueue;
};
leetcode解答:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
std::vector<int> res{};
MonotonicQueue q;
for(int i = 0;i < nums.size();i++){
if(i<k-1){
q.push(nums[i]);
}else{
q.push(nums[i]);
res.push_back(q.max());
q.pop(nums[i-k+1]);
}
}
return res;
}