最小栈,队列的最大值
这两题有点类似,都是要实现O(1)的时间取出最小值或最大值,用空间换时间
155.最小栈
新建一个辅助栈(因为栈先进后出,所以辅助的性质要与原来的一样),由于要取的是最小值,所以只在新加进来的元素比原来元素小时压入辅助栈。弹出的时候只在弹到最小值的时候把辅助栈的值弹出去。(这里要注意,考虑到最小值的相等问题,所以等于最小值的元素也要加入辅助栈)
面试题59 - II.队列的最大值
队列也是类似,新建一个辅助队列,但队列比较难搞,因为先进先出,所以原先的最大值出去后,要立刻能找到下一个最大值,也就是辅助队列要是一个有序队列。
由于队列先进先出的特点,所以只要出现了新的更大的值,就可以不用管前面的元素,但是如果是在后面出现的元素没有前面的元素大,也要将他放入辅助队列,因为可能前面的大数走了之后就是它最大了。
所以对于辅助队列,是一个递减队列,每新加一个元素,就把比它小的元素除去,然后放到队尾。
这里用了一个Deque的对象,可以求队尾最大值,从队尾出去。
155.最小栈
class MinStack { Stack<Integer> stack1; Stack<Integer> stack2; /** initialize your data structure here. */ public MinStack() { stack1=new Stack<Integer>(); stack2=new Stack<Integer>(); } public void push(int x) { if(stack2.isEmpty()||x<=stack2.peek()) {stack2.push(x); stack1.push(x);} else { stack1.push(x); //stack2.push(stack2.peek()); } } public void pop() { int temp=stack1.pop(); if(temp==stack2.peek()) {stack2.pop();} } public int top() { return stack1.peek(); } public int getMin() { return stack2.peek(); }}
/** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.push(x); * obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.getMin(); */
面试题59 - II.队列的最大值
代码的pop_front()函数出了一个奇怪的BUG,求有缘看到的大佬不吝赐教
if(temp==queue2.peekFirst())这一句如果是写成if(queue1.peek()==queue2.peekFirst())就无法判断,不知道为什么啊~
class MaxQueue {
Queue<Integer> queue1;
Deque<Integer> queue2;
public MaxQueue() {
queue1=new LinkedList<Integer>();
queue2=new LinkedList<Integer>(); }
public int max_value() {
if(!queue2.isEmpty())
{return queue2.peek();}
else return -1; }
public void push_back(int value) {
while(!queue2.isEmpty()&&queue2.peekLast()<value)
{
queue2.pollLast(); }
queue2.offerLast(value);
queue1.offer(value); }
public int pop_front() {
if(!queue1.isEmpty())
{
int temp=queue1.peek();
if(temp==queue2.peekFirst())
queue2.poll();
queue1.poll();
return temp;}
else return -1; }}
/** * 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(); */