剑指 Offer 59 - I. 滑动窗口的最大值(困难)

发布时间 2023-07-28 21:30:26作者: 孜孜不倦fly

题目:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> result;
        if(nums.size()==0) return result;
        deque<int> que;                         //要维护这样一个队列:队列能够自动弹出和压入元素,队列首部到尾部递减。要注意存放的元素是数组的下表。
        for(int i=0;i<nums.size();i++){          
            while(!que.empty()&&nums[que.back()]<=nums[i]){     //要保证队列首部到尾部递减,保证了队列首部是当前(每一个)窗口的最大值
                que.pop_back();
            }
            if(!que.empty()&&i-que.front()+1>k){               //队列最大值不在窗口范围内,弹出  
                que.pop_front();
            }
            que.push_back(i);
            if(i>=k-1){                                       //当遍历元素等于窗口数时开始记录最大值和滑动窗口
                result.push_back(nums[que.front()]);
            }
        }
        return result;
    }
};