面试题59 - II. 队列的最大值

题目:

思路:

【1】这道题本质上不难【实际上可以参考  剑指 Offer 30. 包含min函数的栈  】,重点在于怎么处理最大数,和采用什么数据结构进行处理。不过简单点就直接采用LinkedList,毕竟是链表:

如正常队列输入
【1,2,3,4,5,6,7,8,9,8,7,8,5,4,6,7,2,8,8】
那么对于最大数队列要怎么处理呢:
如果没有输出,直到9这个数的位置,最大数是9,且队列输出是固定顺序的,所以应该最大数的队列里面只存一个9就够了。
那么【1,2,3,4,5,6,7,8,9】,这个其实就可以考虑弹出。
由于9这个,可以在还没塞入时对立面的数据进行弹出,从左或者从右都没什么关系
但是考虑到后面【9,8,7,8】,所以必然是从右边弹出而且是
当新塞入的数值V比当前最右边的数值小的时候才会弹出【如果相等的话是不弹出的】,不然就停止弹出

那么剩下的就是要考虑输出问题了,因为最大值只有一个,所以不可能随着正常值一样弹出,必然是碰到了正常队列里面的最大值的时候才会随着弹出

 

代码展示:

//时间25 ms击败89.86%
//内存49 MB击败83.69%
class MaxQueue {
    LinkedList<Integer> nqueue;
    LinkedList<Integer> mqueue;

    public MaxQueue() {
        nqueue = new LinkedList<Integer>();
        mqueue = new LinkedList<Integer>();
    }

    public int max_value() {
        if (mqueue.isEmpty()){
            return -1;
        }
        return mqueue.peekFirst();
    }

    public void push_back(int value) {
        while (!mqueue.isEmpty() && mqueue.peekLast() < value) {
            mqueue.pollLast();
        }
        nqueue.add(value);
        mqueue.add(value);

    }

    public int pop_front() {
        if (nqueue.isEmpty()){
            return -1;
        }
        int ans = nqueue.pollFirst();
        if (ans == mqueue.peekFirst()) {
            mqueue.pollFirst();
        }
        return ans;
    }
}

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue obj = new MaxQueue();
 * int param_1 = obj.max_value();
 * obj.push_back(value);
 * int param_3 = obj.pop_front();
 */

 

posted @ 2023-02-06 11:51  忧愁的chafry  阅读(13)  评论(0编辑  收藏  举报