O(1) getMin
Problem
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.
Solution
A separate minStack.
push
: push to stack as usual; if the new value is smaller or equal to the top of minStack, push to minStackpop
: pop stack usual; if the top value of the stack is also the top value of minStack, pop minStack as welltop
: return stack top valuegetMin
: return minStack top value
Key Points
Duplicates: make sure you push duplicated values to minStack, i.e. push to minStack if the new value is smaller or equal to the top of minStack, otherwise this example will fail:
push(1), push (1), pop(), pop()
x < getLast(minStack)
- push(1):
- stack: [1]
- minStack: [1]
- push (1):
- stack: [1, 1]
- minStack: [1]
- pop:
- stack: [1]
- minStack: []
- pop:
- stack: []
- minStack: IndexOutOfBoundsError
x <= getLast(minStack)
- push(1):
- stack: [1]
- minStack: [1]
- push (1):
- stack: [1, 1]
- minStack: [1, 1]
- pop:
- stack: [1]
- minStack: [1]
- pop:
- stack: []
- minStack: []