II. 队列的最大值

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

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

思路分析:

  • 用双端队列存储队列里元素的最大值
  • 入队时,如果入队的值大于双端队列队尾的值,则一直出队,最后将值入队
  • 出队时,如果队列出队值和双端队列对头元素值相同则双端队列亦出队,否则不出
class MaxQueue {
    Queue<Integer> q;
    Deque<Integer> qq;
    public MaxQueue() {
        q=new LinkedList<>();
        qq=new LinkedList<>();
    }
    
    public int max_value() {
        if(qq.isEmpty()){
            return -1;
        }else{
            return qq.peek();
        }
        
    }
    
    public void push_back(int value) {
        q.offer(value);
        while(qq.size()>0&&qq.peekLast()<value){
            qq.pollLast();
        }
        qq.offer(value);
    }
    
    public int pop_front() {
        int tmp=q.size()>0?q.poll():-1;
        if(qq.size()>0&&tmp==qq.peek()){
            qq.poll();
        }
        return tmp;
    }
}

发布了163 篇原创文章 · 获赞 13 · 访问量 3797

猜你喜欢

转载自blog.csdn.net/qq_42174669/article/details/104724529