面试题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(); */