滑动窗口的最大值

239 阅读1分钟

leetcode-cn.com/problems/hu…

题意:有一个数组nums,给一个长度k,查看数组nums中,长度为k的连续子序列的最大值,存到resultVec中,并返回。

image.png 题解:这个使用双端队列deque,实现单调队列

image.png

针对每一个数,向左找单调递增队列,把下表小于等于i-k的数删掉。然后(i-k,k]区间的最大数就是nums[dequeIndex.front()];

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