题解 | #滑动窗口的最大值#

滑动窗口思路

明确数据结构,双端队列【前后可弹出,后可入】,结果为数组

第一步 滑动窗口记录的最大值永远在队头,所以,在满足窗口大小后需要每次记录

第二步 明确队头弹出的两种情况

一种是超出窗口范围,从前端弹出
一种是后来的数比自身大。从后端弹出

第三步 队尾压入前需要做的是判断当前值是否需要弹出队尾再插入

(比队列存储索引对应的值大)
出现的值比现有队列存储索引对应的值大时,表示该值出现在滑窗中,部分值不会成为最大值,从队尾开始弹出
class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        vector<int>max;
        deque<int>downque;     // 双端递减队列,存的是num的下标
        for(int i=0;i<num.size();i++){
            //出现的值比现有的值大时,表示该值出现在滑窗中,部分值不会成为最大值,从队尾开始弹出
            while(!downque.empty()&&num[i]>num[downque.back()]){
                downque.pop_back();
            }
            downque.push_back(i);
            //队头不在窗口内需要弹出
            if(i-downque.front()+1 >size) downque.pop_front();
            //从size-1开始记录队头,即最大值
            if(i >=size-1) max.push_back(num[downque.front()]);
        }
        return max;
    }
};
全部评论

相关推荐

程序员猪皮:看不到八股什么意思
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务