--- title: '155. Min Stack' description: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time icon: dot topics: - { name: "Stack", slug: "stack" } - { name: "Design", slug: "design" } video: "qkLl7nAwDPo" issue: "https://github.com/prdlk/leetcode/issues/68" companies: - { name: "Microsoft", period: "Three Months", frequency: 42.1 } - { name: "Meta", period: "Three Months", frequency: 34.5 } - { name: "Amazon", period: "Three Months", frequency: 28.9 } - { name: "Google", period: "Three Months", frequency: 28.8 } - { name: "Odoo", period: "Six Months", frequency: 100 } - { name: "UiPath", period: "Six Months", frequency: 100 } - { name: "Infosys", period: "Six Months", frequency: 67.9 } - { name: "Bloomberg", period: "Six Months", frequency: 45.6 } sidebar: label: 'Min Stack' badge: 'Medium' --- ::::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() ```