思想很简单:  
1. 构造出一个窗口(用deque,这里不用queue是因为queue没有迭代器不方便操作)  
2. 找出第一个窗口的最大值,记录下来,并压入返回数组  
3. 后续移除首元素,添加下一个元素构成新的窗口。如果前一个窗口的最大值是被移除的首元素则重新找最大值  
4. 不然将前一个窗口的最大值和下一个添加元素比较,得出当前窗口的最大值,覆盖最大值,并压入返回数组  
5. 循环3、4步直到数据集末尾

空间复杂度O(n)
时间复杂度O(n)
实际上额外的空间只有一个窗口大小
如果每次都是首元素最大,则时间复杂度会更高(接近O(n*size))

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& nums, int size) {
      int i = 0;
      int max = -99999;
      std::deque<int> window;
      std::vector<int> res;
      
      for (; i < size; ++i) {
        window.push_back(nums[i]);
      }
      
      max = find_max(window, window.begin(), window.end());
      res.push_back(max);
      
      //  后面的窗口只需要移除和添加即可
      //  如果最大值被移除则需要重新找
      while (i < nums.size()) {
        if (max == window.front()) {
          max = find_max(window, window.begin() + 1, window.end());
        }
        window.pop_front();
        window.push_back(nums[i++]);
        if (max < *(window.end() - 1)) {
          max = *(window.end() - 1);
        }
        res.push_back(max);
      }
      
      return res;
    }
  private:
    int find_max(std::deque<int> &window, std::deque<int>::iterator fir, std::deque<int>::iterator las) {
      int max = -99999;
       //  第一个窗口
      while (fir != las) {
        if (*fir >= max) {
          max = *fir;
        } 
        ++fir;
      }     
      
      return max;
    }
};
```​