leetcode239.滑动窗口最大值

解析参考:
https://blog.csdn.net/u010429424/article/details/73692248

代码参考:
https://leetcode.com/problems/sliding-window-maximum/discuss/65956/My-C%2B%2B-O(n)-deque-based-solution-with-explanation

用单调队列做(从队头到队尾递减,队头为最大值)
队列存放下标,用于判断队首元素是否在窗口之外
步骤如下:
1.如果队列非空,则将元素入队列,并保证队列递减(在此过程中需要pop出比它小的元素)
2.入队列后判断队首元素如果在窗口之外,则移除队首元素
3.从第k-1个位置开始记录队首元素(k-1之前窗口还没满)

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3,依次如队列时,队列变化如下:
1
3
3,-1              
3,-1,-3
5
5,3
6
7
最大值依次为3,355,67(从第三行开始的队头元素)
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int> buffer;
        vector<int> res;

        for(auto i=0; i<nums.size();++i)
        {
            while(!buffer.empty() && nums[i]>=nums[buffer.back()]) buffer.pop_back(); //将比要加入元素小的元素都移除,保证队列从头到尾递减
            buffer.push_back(i); //把元素加入队尾

            if(i>=k-1) res.push_back(nums[buffer.front()]); //从第k-1开始记录答案
            if(buffer.front()<= i-k + 1) buffer.pop_front(); //如果队首元素超出窗口,则移除。窗口尾的位置是i,窗口大小为k,则窗口头位置是i-k+1,而如果当前队头=i-k+1时,下一轮循环时队头就超出窗口了,因此在这里移除
        } 
        return res;
    }
};

你可能感兴趣的:(leetcode)