Min Stack

Problem Statement

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

Example: push(2), push(0), push(3), push(0), getMin() → 0

Approach 1: Brute Force

Explanation: Store all elements; find min by scanning stack each time.

Time Complexity: push/pop O(1), getMin O(n)

Space Complexity: O(n)

stack = empty
push(x): stack.push(x)
pop(): stack.pop()
top(): return stack[-1]
getMin(): return min(stack)
      

Approach 2: Auxiliary Stack (Better)

Explanation: Maintain an additional stack to track current minimum.

Time Complexity: O(1) for all operations

Space Complexity: O(n)

stack = empty
minStack = empty
push(x):
    stack.push(x)
    if minStack is empty or x <= minStack.top():
        minStack.push(x)
pop():
    if stack.pop() == minStack.top():
        minStack.pop()
top(): return stack.top()
getMin(): return minStack.top()
      

Approach 3: Single Stack with Encoded Values (Optimal)

Explanation: Use single stack with encoded differences to track minimum.

Time Complexity: O(1)

Space Complexity: O(n)

stack = empty
minVal = ∞
push(x):
    if x < minVal:
        stack.push(2*x - minVal)
        minVal = x
    else:
        stack.push(x)
pop():
    top = stack.pop()
    if top < minVal:
        minVal = 2*minVal - top
top(): return minVal if top < minVal else top
getMin(): return minVal