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 };