/* 暴力O(n*k) 每一个数字都从k个窗口中判断你最大值 单调队列 O(n) 遍历数组中每一个元素 用一个容器来存放每次遍历的值 如果当前元素比容器最后一个元素大,容器最后一个元素删除,然后继续当前元素和最后一个比较。为了保证队列中最大值始终位于队头 如果容器头部元素已经不在容器范围内自然出队 当前元素入队 当滑动窗口的首地址大于等于窗口大小时,每入队一次将最大值(队头元素)存放在res向量中。 */ class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> res; deque<int> s; if(size <= 0)return res; for(int i = 0; i < num.size(); i++){ // 从后面依次弹出队列中比当前num值小的元素,比num小的值对结果没有影响 // 同时保证队列首元素为当前窗口最大值下标 while(s.size() && num[s.back()] <= num[i]) s.pop_back(); //队首元素元素不在窗口中,需要弹出 用下标判断 while(s.size() && i - s.front() + 1 > size) s.pop_front(); s.push_back(i); //把每次滑动的num下标加入队列 //当滑动窗口首地址i大于等于size时才开始写入窗口最大值 size要大于0 if( size && i+1 >= size) res.push_back(num[s.front()]); } return res; } };