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 };
来源:博客园
作者:ben_zhuback
链接:https://www.cnblogs.com/znshao/p/11444469.html