leetCode Min Stack解题分享

原题:https://oj.leetcode.com/problems/min-stack/

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • getMin() -- Retrieve the minimum element in the stack.

题目其实不难,但是是leetCode今天刚刚新增的一个题目,索性抢个头彩把解题过程分享出来:

直接上AC代码:

public class MinStack {
	
	private int min = Integer.MAX_VALUE;
	private int minIndex = -1;
	private ArrayList<Integer> stack = new ArrayList<Integer>();
	private int length = 0;
	private HashMap<Integer,Integer> secondMinMap = new HashMap<Integer, Integer>();
	
    public void push(int x) {
    	stack.add(x);
    	
    	if(x <= min) {     //注意这里犯过错误,需要加=号,原因是当栈空的时候如果push一个Integer.MaxValue的话,需要将此时的minIndex变为0而不是继续为-1。
    					   //否则的话,这种情况下,当push第二个数的时候,将出现secondMap.put(1,-1)的情况,进而当pop这个数的时候,会出现stack.get(-1)操作。
    					   //换句话说,这个secondMap里的值只有当key=0的时候,才能为-1,其他情况必须有能指向数组里位置的值
    		secondMinMap.put(length, minIndex);   //这里存的 length位置对应的第二小的,只考虑比length小的索引即可
    										      //因为用到的场景是当前这个如果被pop了,说明它上面的所有都已经被pop了
    										      //这个时候如果当前是min,那么接下来只需要在它下面去找第二小的就行了
    		minIndex = length;
    		min = x;
    	}
    	length ++;
    }

    public void pop() {
    	
    	if(length == 0) return;
        
    	if(minIndex == length-1) {
    		
    		if(minIndex == 0) {
    			minIndex = -1;
    			min = Integer.MAX_VALUE;
    		} else {
    			minIndex = secondMinMap.get(length-1);
        		secondMinMap.remove(length-1);
        		min = stack.get(minIndex);
    		}
    		
    	}
    	stack.remove(length-1);
    	length--;
    }

    public int top() {
        return stack.get(length-1);
    }

    public int getMin() {
        return min;
    }
    
    
    public static void main(String[] args) {
    	MinStack stack = new MinStack();
    	
    	stack.push(2147483646);
    	stack.push(2147483646);
    	stack.push(2147483647);
    	
    	System.out.println(stack.top());
    	stack.pop();
    	
    	System.out.println(stack.getMin());
    	stack.pop();
    	
    	System.out.println(stack.getMin());
    	stack.pop();
    	
    	stack.push(2147483647);
    	
    	System.out.println(stack.top());
    	System.out.println(stack.getMin());
    	
    	stack.push(-2147483648);
    	
    	System.out.println(stack.top());
    	System.out.println(stack.getMin());
    	stack.pop();
    	
    	System.out.println(stack.getMin());
    	
	}
    

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值