leetcode--155. Min Stack
阿新 • • 發佈:2019-02-22
emp sta n) ports long public after min() minimum
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; } }
leetcode--155. Min Stack