滑动窗口

匿名 (未验证) 提交于 2019-12-02 23:57:01
 1 class Solution{  2  public:  3     vector<int> maxInWindows(const vector<int> &nums,unsigned int size){  4         vector<int> res;  5         if(nums.empty() || size <= 0)  6             return res;  7           8         //滑动窗口  用一个双端队列来记录窗口的最大值  9         /* 10         判断逻辑 11         队列是空 直接加入 12         队列不为空  和对尾元素进行比较   如果比队尾元素小  加到队尾 13                                     如果比队尾元素大  队尾元素一直弹出 直到大于插入元素 14         需要注意的点: 15         1.队首元素的过期 去除问题  q.front() == i-w  比如三个元素 窗口大小是2 16         如果此时队首是第一个元素 也就是0   遍历到第三个元素的时候 index是2  就需要弹出队首 17         2.拿出队首加到结果集中 什么时候开始需要记录   n个元素  最多有n-w+1个窗口 因此i>= w-1 18         */ 19         deque<int> d; 20         for(int i = 0;i<nums.size();i++){ 21             while(!d.empty() && nums[d.back()] <= nums[i]) 22                 d.pop_back(); 23             d.push_back(i); 24             if(d.front() == i-size) 25                 d.pop_front(); 26             if(i >= size-1) 27                 res.push_back(nums[d.front()]); 28         } 29          30         return res; 31     } 32      33 };

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!