0
点赞
收藏
分享

微信扫一扫

剑指 Offer 59 - II. 队列的最大值

孟祥忠诗歌 2022-02-03 阅读 65
算法

 题目描述:

分析:用两个队列来实现以上功能,队列q1进行正常的push和pop操作,队列q2用来存储最大值。

其中q2为单调队列,每次插入新元素时,都把单调队列中的所有小于该值的数字删除,来保持单调队列的单调性。

具体可以参考:

https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-ii-dui-lie-de-zui-da-zhi-by-leetcod/

代码如下: 

class MaxQueue {
public:
    // q1正常存储数字
    queue<int> q1;
    // q2维持一个单调队列,保存最大值
    deque<int> q2;

    MaxQueue() {
        
    }
    
    int max_value() {
        // 如果q1或者q2为空,返回-1
        if(q1.empty()||q2.empty())
            return -1;
        else
            // 否则的话,q2的首元素就是当前队列的最大值
            return q2.front();
    }
    
    void push_back(int value) {
        // q1正常插入数字
        q1.push(value);
        // 每当插入一个新元素时,都把单调队列q2中所有比该元素小的数字都删除
        while(!q2.empty()&&q2.back()<value)
            q2.pop_back();
        // 在q2最后加入value
        q2.push_back(value);
    }
    
    int pop_front() {
        // 如果q1为空,那么返回-1
        if(q1.empty())
            return -1;
        // 记录下q1的首元素
        int temp=q1.front();
        // 弹出q1的首元素
        q1.pop();
        // 如果弹出的q1首元素也是q2的首元素,那么q2中该元素也弹出
        if(temp==q2.front())
            q2.pop_front();
        // 返回该弹出值
        return temp;
    }
};

/**
 * 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();
 */
举报

相关推荐

0 条评论