LeetCode剑指offer59 - ||: 队列最大值

LeetCode剑指offer59 - ||: 队列最大值

  1. 最初思路:维护一个最大值记录数MAX,每当新的数加入队列时更新这个记录器
    结果发现,当最大值被取出后,没法找到下一个最大值。。。
public int pop_front() {

        if(queue.size()==0)return -1;
        int res = queue.removeFirst();
        if(res == MAX&&count==1){
            //怎么找下一个最大值???
        }

        return res;
    }
  1. 这时想到了之前做过的单调栈,但是觉得可能不用增加空间,想不出来怎么实现,就去看题解了

  2. 结果题解的思路还是用了一个辅助队列。于是自己再构思一下思路:
    需要一个辅助队列,队头能立马获取最大值;
    从队头到队尾必须是非递增的。否则某次取出队头时就不是最大值了;
    那么怎么让新加到队尾的比之前的队尾小?
    想一小会。。。。
    简单啊,反正你不是用来保存我的真实数据的,那比新队尾大的直接扔掉不就好了吗!
    正所谓弱肉强食,要把比自己弱的都踢掉(bushi)
    好耶,又解决了,我真棒

  3. 等会,怎么把原来的队尾除掉??不是只能从队头除掉吗??记得还有双端队列这玩意,不过我查了一下,我用的linedlist中就有类似双端队列的方法。大功告成

  4. 完整代码

class MaxQueue {
    private Deque<Integer>queue;
    private LinkedList<Integer>fuzhu;//辅助单调队列,记录最大值

    public MaxQueue() {
        queue=new LinkedList<>();
        fuzhu=new LinkedList<>();
        
    }
    
    public int max_value() {
        if(queue.size()==0)return -1;
        return fuzhu.getFirst();
    }
    
    public void push_back(int value) {
        queue.addLast(value);
        //辅助队列,一直把小于value的都踢掉
        //等于的不用踢,出队时再一个个踢
        while((!fuzhu.isEmpty())&&value>fuzhu.getLast()){
            fuzhu.removeLast();
        }
        fuzhu.addLast(value);
    }
    
    public int pop_front() {

        if(queue.size()==0)return -1;
        int res = queue.removeFirst();
        //数据队列最大值走了,辅助队列也要走
        //两个队列重复数的情况也相同
        if(res == fuzhu.getFirst())fuzhu.removeFirst();
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值