3.7 队列的最大值

题目

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的时间复杂度都是O(1)。

若队列为空,pop_front 和 max_value 需要返回 -1

示例1

输入: 
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]

示例2

输入: 
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]

思路

  • 早上第一题有点懵,想复杂了给,其实这个跟"滑动窗口的最大值"的方法有一些像,但是比它简单,都是用了一个双向队列来记录最大值。
  • 用两个队列,q来作为主队列。dq作为辅助队列。
  • dq的特点就是首元素最大,后面的元素降序。
  • 当一个新的元素value要进入队列q的时候,判断value应该放到dq中的哪个位置,从dq的末尾开始比较,遇到比它小的元素就出队列,直到队列为空或是找到一个比value大的数,然后把value从尾部入队列。
  • 当首元素出队列的时候,要注意最大值可能会变化,所以要更新dq,方法就是判断dq首元素是否等于该值,等于的话dq首元素也出队列,否则不变。

代码

class MaxQueue {
private:
    queue<int> qMain;
    deque<int> dq;

public:
    MaxQueue() {

    }
    
    int max_value() {
        int res = -1;

        if ( !qMain.empty() )
            res = dq.front();
        
        return res;
    }
    
    void push_back(int value) {
        qMain.push( value );

        while ( !dq.empty() && value > dq.back() )
            dq.pop_back();
        
        dq.push_back( value );

        return;
    }
    
    int pop_front() {
        int res = -1;

        if (!qMain.empty() ) {
            if ( qMain.front() == dq.front() )
                dq.pop_front();
            
            res = qMain.front();
            qMain.pop();
        }
        
        return res;
    }
};

/**
 * 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();
 */
发布了183 篇原创文章 · 获赞 43 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/m0_37822685/article/details/104710261
3.7