单调队列模板

 1 class Solution 
 2 {
 3 public:
 4     vector<int> maxSlidingWindow(vector<int>& nums, int k) 
 5     {
 6         vector<int> res;
 7         deque<int> q;
 8         for(int i = 0;i < nums.size();i ++)
 9         {
10             //看滑动窗口是否大于k
11             if(q.size() && i - k + 1 > q.front()) q.pop_front();
12             //维持一个严格单调下降的双端队列
13             while(q.size() && nums[q.back()] <= nums[i]) q.pop_back();
14             q.push_back(i);//把当前下标放入双端队列中
15             //滑动窗口大小满足k
16             if(i >= k - 1) res.push_back(nums[q.front()]);
17         }
18         return res;
19     }
20 };

 模板:

 1     class MyQueue { //单调队列(从大到小)
 2     public:
 3         deque<int> que; // 使用deque来实现单调队列
 4         // 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
 5         // 同时pop之前判断队列当前是否为空。
 6         void pop(int value) {
 7             if (!que.empty() && value == que.front()) {
 8                 que.pop_front();
 9             }
10         }
11         // 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。 
12         // 这样就保持了队列里的数值是单调从大到小的了。
13         void push(int value) {
14             while (!que.empty() && value > que.back()) {
15                 que.pop_back();
16             }
17             que.push_back(value);
18 
19         }
20         // 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
21         int front() {
22             return que.front();
23         }
24     };

 

posted @ 2020-04-24 22:34  Jinxiaobo0509  阅读(136)  评论(0)    收藏  举报