【剑指offer】【队列】59-II.队列的最大值

队列的最大值

[题目链接][https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/]
额外维护一个单调队列(双端队列):
1. max_value: max_q为空返回-1,不空返回对头元素
2. push_back: value入队,判断value是否大于当前队尾元素,如果大于,一直出队;最后将该元素入队;
3. pop_front:如果队列q为空,返回-1,否则判断要出队的元素是不是队列的最大值,如果是max_q与q都出队。

class MaxQueue {
public:
    queue<int> q;
    deque<int> max_q;
    MaxQueue() {
        max_q.push_back(-1);
    }
    
    int max_value() {
        if(!max_q.empty()) return max_q.front();
        else return -1;
    }
    
    void push_back(int value) {
        q.push(value);
        while(!max_q.empty() && value >= max_q.back())
        {
            max_q.pop_back();
        }
        max_q.push_back(value);
        
    }
    
    int pop_front() {
        if(q.empty()) return -1;
        int x = q.front();
        if(x == max_q.front() && !max_q.empty()) max_q.pop_front();
        q.pop();
        return x;
    }
};

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue* obj = new MaxQueue();
 * int param_1 = obj->max_value();
 * obj->push_back(value);
 * int param_3 = obj->pop_front();
 */

猜你喜欢

转载自www.cnblogs.com/Trevo/p/12601952.html