滑动窗口的最大值

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

思路:

使用一个双端队列window,保持window里的值从队首到队尾是从大到小的。每次取window的队首元素为窗口里的最大值。新元素入队时,判断队尾元素是否比新元素小,如果小,则队尾元素出队,否则新元素入队。取最大值时,要确保队首元素都在窗口里,如果不在,则让其出队。然后再拿队首元素当最大值。

代码:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int> window;
        for(int i = 0;i < k;i++) {
            while(!window.empty() && nums[window.back()] <= nums[i]) {
                window.pop_back();
            }
            window.push_back(i);
        }
        vector<int> ans;
        ans.push_back(nums[window.front()]);
        int len = nums.size();
        for(int i = k;i < len;i++) {
            while(!window.empty() && nums[window.back()] <= nums[i]) {
                window.pop_back();
            }
            window.push_back(i);
            while(window.front() <= i-k) {
                window.pop_front();
            }
            ans.push_back(nums[window.front()]);
        }
        return ans;
    }
};