0
点赞
收藏
分享

微信扫一扫

LeetCode 239. 滑动窗口最大值


LeetCode 239. 滑动窗口最大值_职场和发展

我们需要维护一个单调递减的队列,队首始终是当前窗口最大值,维护这个单调递减队列的方式如下:

  • pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队首弹出元素,如果从窗口移除的元素不是队首元素,就不用操作队列
  • push(value):如果push的元素value大于队尾元素的数值,那么就不断弹出队尾的元素,直到队空或value的数值小于等于队列入口元素的数值为止,然后当前value入队尾

单调递减队列如下:

class MyQueue{
public:
// 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
// 这样就保持了队列里的数值是单调从大到小的了。
void push(int val){
while(!que.empty() && val > que.back()){
que.pop_back();
}
que.push_back(val);
}

// 每次弹出的时候,比较当前要弹出的数值val是否等于队列出口元素的数值,如果相等则弹出。
// 同时pop之前判断队列当前是否为空。
void pop(int val){
if(!que.empty() && val == que.front()){
que.pop_front();
}
}

int front(){
return que.front();
}
private:
deque<int> que;
};

vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
MyQueue q;
for(int i = 0; i < k; i++){
q.push(nums[i]);
}
ans.push_back(q.front());

for(int i = k; i < nums.size(); i++){
q.pop(nums[i - k]); // 先移除,再加入新的元素
q.push(nums[i]);
ans.push_back(q.front());
}
return ans;
}


举报

相关推荐

0 条评论