class Solution {
public:
    vector<int> maxInWindows(const vector<int>& nums, int size) {
        // 单调队列,里面存的是数组下标。
        // 这个队列需要满足一个特性:队列前面的下标指向的元素一定比队列后面下标指向的元素要大。
        deque<int> max_elements;
        
        vector<int> ret;
        for (int i = 0; i < nums.size(); ++i)
        {
            // i这个下标应该放在哪里?
            // 直接从队列末尾开始扫,只要<=它,统统干掉
            while (!max_elements.empty() && (nums[max_elements.back()] <= nums[i]))
                max_elements.pop_back();
            
            // 放进i这个下标
            max_elements.push_back(i);
            
            // 队列前面的元素一定是最大的,所以理想状态下我们直接选最前面的就行
            // 但是这是个窗口,前面的元素可能已经不在这个窗口里面了,因此这里看看前面的元素还在不在,不在就删了
            while ((max_elements.front() + size) <= i)
                max_elements.pop_front();
            
            // 如果i满足形成窗口的条件,那么就把值送进返回数组
            if (i >= size - 1)
                ret.push_back(nums[max_elements.front()]);
        }
        return ret;
    }
};
简短,可读,高效,附带所有思考过程的C++代码,弄不懂的看就完了