leetcode 239. Sliding Window Maximum

https://www.cnblogs.com/grandyang/p/4656517.html

使用双端队列维护一个单调递减的队列。使用双端队列的原因是,当顶部元素不在这个窗口的时候,就需要弹出,并且是从前面弹出,保证插入的元素的顺序不变。

单调递减是因为让双端队列的头部一直是当前窗口的最大值,只要这个最大值在窗口内,无论怎么滑都是最大值

递减是为了保证 后面的窗口可能出现的最大值

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> result;
        deque<int> d;
        for(int i = 0;i < nums.size();i++){
            if(!d.empty() && d.front() == i - k)
                d.pop_front();
            while(!d.empty() && nums[d.back()] < nums[i])
                d.pop_back();
            d.push_back(i);
            if(i - k >= -1)
                result.push_back(nums[d.front()]);
        }
        return result;
    }
};
原文地址:https://www.cnblogs.com/ymjyqsx/p/10522064.html