class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        vector<int> res;
        if(size > num.size()) return res;
        deque<pair<int, int> > dq; //严格递减队列
        for(int cur = 0; cur < num.size(); cur++) {
            while(!dq.empty() && num[cur] >= dq.back().first) //当前元素比队尾元素大时
                dq.pop_back(); //将队尾元素弹出
            dq.push_back({num[cur], cur}); //在队尾插入当前元素
            if(cur >= size - 1) { //开始计算
                while(dq.front().second < cur - size + 1) //当队头下标在当前窗口左边时
                    dq.pop_front(); //弹出队头元素
                res.push_back(dq.front().first); //队头为当前窗口最大值
            }   
        }
        return res;
    }
};