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.
将min设成long是因为可能是Integer.MAX_VALUE-Integer.MIN_VALUE
栈里存储的是push的值与最小值的差值。如果,差值小于零,说明push的值比最小值还要小,当取出的时候如果是小于零的值,取出的值就是min同时更新min
class MinStack { long min; Stack<Long> st; /** initialize your data structure here. */ public MinStack() { st=new Stack<>(); } public void push(int x) { if(st.isEmpty()){ st.push(0L); min=x; } else{ st.push(x-min); if(x<min) min=x; } } public void pop() { if(st.isEmpty())return; long p=st.pop(); if(p<0) min=min-p; } public int top() { long t=st.peek(); if(t<0) return (int)min; else return (int)(t+min); } public int getMin() { return (int)min; } }
这还有个绝妙的做法
class MinStack { int min = Integer.MAX_VALUE; Stack<Integer> stack = new Stack<Integer>(); public void push(int x) { // only push the old minimum value when the current // minimum value changes after pushing the new value x if(x <= min){ stack.push(min); min=x; } stack.push(x); } public void pop() { // if pop operation could result in the changing of the current minimum value, // pop twice and change the current minimum value to the last minimum value. if(stack.pop() == min) min=stack.pop(); } public int top() { return stack.peek(); } public int getMin() { return min; } }