剑指Offer 队列的最大值

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

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

分析:
用一个queue和deque实现。
queue负责pop和push,deque负责存放最大值。
如果新的value的值大于deque尾端的值,那么deque一直进行pop_back操作,直至deque为空或者尾端的值大于等于value,然后将value值压入deque尾部,每次取max_value,返回deque首部的值。
当queue进行pop或push操作时,如果queue首部的值等于deque首部的值,那么deque同时需要进行pop_front操作。

class MaxQueue
{
  public:
    maxQueue()
    {
    
    } 
    int max_value
    {
      return que.empty()?-1 : que.front();
    }
    void push_back(int value)
    {
      que.push(value);
      while(!deq.empty() && deq.back()<value)
      {
          deq.pop_back();
      }
      deq.push_back(value);
    }
    int  pop_front()
    {
       if(que.empty()) return -1;
       int t=que.front();
       que.pop();
       if(t==deq.front()) deq.pop_front();
       return t;
    }

  private:
    queue<int> que;
    deque<int> deq;
};
发布了55 篇原创文章 · 获赞 1 · 访问量 739

猜你喜欢

转载自blog.csdn.net/weixin_43086349/article/details/104732103