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

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

 

【单调队列】维护一个单调队列来确定最大值。举个🌰

3 4 5 1 2 3 6 这样入队列:

3入的时候,max队列中入3

4入的时候,我们发现,此时的3已经对后面完全不起作用了,因为有4挡着,而且4出队列的时候3其实早就已经出来了,同理,如果max中还有比4小的也是同样不起作用,所以可以从后向前遍历max队列,把比4小的都出队,把4入队

5入队同理,此时max队伍里只有5

1入队的时候要注意,max中要从后面加上1,因为一旦5出队列,那么剩下的最大的就是1了

2入队的时候,从后往前检查max,把1丢掉,max中剩下5,2,这样的话5即使出队列,1也比2小,剩下的最大值还是2

3入队同理,max变成了5,3

6入队的时候,max只剩6了,因为前面这一堆出不出队列,当前的最大值都是6了。

class MaxQueue {

    public Deque<Integer> queue = new LinkedList();
    public Deque<Integer> max = new LinkedList();

    public MaxQueue() {

    }
    
    public int max_value() {
        if(queue.isEmpty()) return -1;
        return max.peek();
    }
    
    public void push_back(int value) {
        queue.offer(value);
        while(!max.isEmpty() && max.peekLast() < value) max.pollLast();
        max.offer(value);
    }
    
    public int pop_front() {
        if(queue.isEmpty()) return -1;
        int value = queue.poll();
        if(max.peek() == value) max.poll();
        return value;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值