• 定义单调栈;
  • 如果当前元素大于队尾对应元素,弹出队尾元素;
  • 如果队首元素和当前遍历索引超过窗口大小,弹出队首元素;
  • 将遍历索引加入队列,如果索引大于窗口大小,将队首元素放入结果。
class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        vector<int> result;
        if(size > num.size() || size == 0 || num.size() == 0) return result;
        int len = num.size();
        deque<int> dq;
        for (int i = 0; i < len; i++) {
            while (!dq.empty() && num[i] > num[dq.back()]) {
                dq.pop_back();
            }
            while (!dq.empty() && i - dq.front() >= size) {
                dq.pop_front();
            }
            dq.push_back(i);
            if (i + 1 >= size) {
                result.push_back(num[dq.front()]);
            }
        }
        return result;
    }
};