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.
Example:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> Returns -3. minStack.pop(); minStack.top(); --> Returns 0. minStack.getMin(); --> Returns -2.
class MinStack {// 栈 my List<Integer> list ; int num; int min; /** initialize your data structure here. */ public MinStack() { list= new ArrayList<Integer>(); num =0; min=Integer.MAX_VALUE; } public void push(int x) { list.add(x); num++; if(min>x){ min=x; } } public void pop() { if (0<num){ if(min == list.get(num-1)){ min=Integer.MAX_VALUE; for (int i = 0; i < num-1; i++) { if(min>list.get(i)){ min=list.get(i); } } } list.remove(num-1); num--; } } public int top() { return num>0?list.get(num-1):0; } public int getMin() { return min; } }
时间复杂度为O(1)的解法
class MinStack { Stack<Integer> minStack ; Stack<Integer> stack; int min=Integer.MAX_VALUE; /** initialize your data structure here. */ public MinStack() { stack=new Stack<Integer>(); minStack = new Stack<Integer>(); min=Integer.MAX_VALUE; } public void push(int x) { stack.push(x); if(min>x){ min=x; } minStack.push(min); } public void pop() { if(!stack.isEmpty()){ minStack.pop(); stack.pop(); } if(stack.isEmpty()){ min = Integer.MAX_VALUE; } else{ min = minStack.peek(); } } public int top() { return stack.peek(); } public int getMin() { return min; } }