单调队列模板
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 };
Mamba never out

浙公网安备 33010602011771号