leetcode打卡

最小栈,队列的最大值
这两题有点类似,都是要实现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(); */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值