算法:队列的最大值

问题

  • 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
    若队列为空,pop_front 和 max_value 需要返回 -1

解决

//1、暴力解法,直接创建一个队列(使用数值模拟出队列效果,通过移动指针达到移除添加元素的效果)
class MaxQueue {
    int[] queue=new int[10000];
    int begin=0,end=0;
    //队首元素不一定是最大值
    public MaxQueue() {                     //最大队列

    }
    
    public int max_value() {                //最大值
        int ans=-1;
        for(int i=begin;i!=end;i++){
            ans=Math.max(ans,queue[i]);
        }
        return ans;
    }
    
    public void push_back(int value) {      //入队
        queue[end++]=value;
    }

    public int pop_front() {                //出队(首)
        if(begin==end) return -1;
        return queue[begin++];
    }
}


 2、创建一个普通队列、单调队列
class MaxQueue{

    Queue<Integer> q;//普通队列
    Deque<Integer> d;//单调队列

    public MaxQueue(){
        q = new LinkedList<Integer>();
        d = new LinkedList<Integer>();
        
    }
    public int max_value(){
        if(q.isEmpty()){
            return -1;
        }
            return d.peekFirst();
    }
    public void push_back(int value){
        //当单调队列不为空,并且当前队列尾部<添加数时,先将队尾元素移除
         while (!d.isEmpty() && d.peekLast() < value) {
            d.pollLast();
        }
        d.offerLast(value);     //添加元素到两个队列中
        q.offer(value);
    }
    public int pop_front(){
        if(q.isEmpty()){
            return -1;
        }
        int ans=q.poll();
        if(ans==d.peekFirst()){
            d.pollFirst();
        }
        return ans;
    }
}

posted @   new_monkey  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示