[LeetCode] 155. 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.
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.
Thought process:
The difficulty of this problem is figuring out how to track the minimums. The idea is to use two stacks.
- Stack 1 is the main data structure.
- Stack 2 keeps track of the minimum and all previous minimums.
If the number popped from stack 1 is the current minimum, pop the number from stack 2 as well. Therefore, if a number pushed equals the current minimum, it should also be pushed onto stack 2.
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | public class MinStack { private Stack<Integer> stack; private Stack<Integer> minimums; /** initialize your data structure here. */ public MinStack() { stack = new Stack<>(); minimums = new Stack<>(); } public void push(int x) { if (stack.isEmpty() || x <= minimums.peek()) { minimums.push(x); } stack.push(x); } public void pop() { if (!stack.isEmpty()) { int popped = stack.pop(); if (popped == minimums.peek()) { minimums.pop(); } } } public int top() { if (!stack.isEmpty()) { return stack.peek(); } else { return -1; } } public int getMin() { if (!stack.isEmpty()) { return minimums.peek(); } else { return -1; } } } /** * 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(); */ |
Time complexity:
All methods are O(1). This is achieved by spending extra space.
Comments
Post a Comment