【剑指offer】【队列】59-I.滑动窗口的最大值

题目链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/

单调队列

时间复杂度:O(n)
空间复杂度:O(k):双端队列中最多同时存储k个元素,即窗口大小

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        deque<int> de; //队列中存的是索引
        vector<int> res;
        for(int i = 0; i < nums.size(); i++)
        {
            // 判断队头是否滑出窗口 i - k + 1为滑动窗口的开头
            if(!de.empty() && i - k + 1 > de.front()) de.pop_front();
            // 队尾元素小于等于当前元素时,队尾元素出队
            while(!de.empty() && nums[i] >= nums[de.back()]) de.pop_back();

            // 当前元素下标入队
            de.push_back(i);
            //每次都将最大值保存到结果中
            //i - k + 1 >= 0的时候才入队
            if(i >= k - 1) res.push_back(nums[de.front()]);
        }
        return res;
    }
};
posted @ 2020-04-02 20:02  NaughtyCoder  阅读(78)  评论(0)    收藏  举报