【C++】19行双向单调队列

滑动窗口的最大值

http://www.nowcoder.com/questionTerminal/1624bc35a45c42c0bc17d17fa0cba788

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        vector<int> res;
        if(size > num.size()) return res;
        deque<pair<int, int> > dq; //严格递减队列
        for(int cur = 0; cur < num.size(); cur++) {
            while(!dq.empty() && num[cur] >= dq.back().first) //当前元素比队尾元素大时
                dq.pop_back(); //将队尾元素弹出
            dq.push_back({num[cur], cur}); //在队尾插入当前元素
            if(cur >= size - 1) { //开始计算
                while(dq.front().second < cur - size + 1) //当队头下标在当前窗口左边时
                    dq.pop_front(); //弹出队头元素
                res.push_back(dq.front().first); //队头为当前窗口最大值
            }   
        }
        return res;
    }
};
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务