--- title: '155. Min Stack' description: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time sidebar: label: 'Min Stack' badge: 'Medium' --- Stack ::::warning You must implement a solution with O(1) time complexity for each function. :::: ### Example 1: - Input: `` - Output: `` - Explanation: Input `["MinStack","push","push","push","getMin","pop","top","getMin"]` [[],[-2],[0],[-3],[],[],[],[]] Output `[null,null,null,null,-3,null,0,-2]` Explanation MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); // return `-3` minStack.pop(); minStack.top(); // return `0` minStack.getMin(); // return `-2` ### Constraints: - `-2^31 <= val <= 2^31 - 1` - Methods pop, top and getMin operations will always be called on non-empty stacks. - At most 3 * 10^4 calls will be made to push, pop, top, and getMin. ## Approach ```mermaid flowchart TD subgraph state["two parallel stacks — same depth, always"] A["stack — the values"] B["minStack — the minimum as of that depth"] end state --> P subgraph P["push(value)"] P1["stack.append(value)"] --> P2["minStack.append(min(value, minStack[-1]))"] end state --> O subgraph O["pop()"] O1["pop both stacks together"] end state --> R subgraph R["top() / getMin() — O(1)"] R1(["stack[-1] / minStack[-1]"]) end ``` ## Solution ```py class MinStack: def __init__(self): self.stack = [] self.minStack = [] def push(self, value: int) -> None: self.stack.append(value) value = min(value, self.minStack[-1] if self.minStack else value) self.minStack.append(value) def pop(self) -> None: self.stack.pop() self.minStack.pop() def top(self) -> int: return self.stack[-1] def getMin(self) -> int: return self.minStack[-1] # Your MinStack object will be instantiated and called as such: # obj = MinStack() # obj.push(value) # obj.pop() # param_3 = obj.top() # param_4 = obj.getMin() ``` ## Explanation