Easy
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
Implement the MinStack class:
MinStack() initializes the stack object.void push(int val) pushes the element val onto the stack.void pop() removes the element on the top of the stack.int top() gets the top element of the stack.int getMin() retrieves the minimum element in the stack.Example 1:
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:
-231 <= val <= 231 - 1pop, top and getMin operations will always be called on non-empty stacks.3 * 104 calls will be made to push, pop, top, and getMin.To solve the problem and implement the MinStack class that supports push, pop, top, and getMin operations in constant time, we can use two stacks:
main_stack and min_stack.main_stack.min_stack is empty or the value is less than or equal to the top of min_stack, push the value onto min_stack.main_stack.min_stack, pop it from min_stack.main_stack.min_stack.class MinStack:
def __init__(self):
self.main_stack = []
self.min_stack = []
def push(self, val: int) -> None:
self.main_stack.append(val)
if not self.min_stack or val <= self.min_stack[-1]:
self.min_stack.append(val)
def pop(self) -> None:
if self.main_stack:
if self.main_stack[-1] == self.min_stack[-1]:
self.min_stack.pop()
self.main_stack.pop()
def top(self) -> int:
if self.main_stack:
return self.main_stack[-1]
def getMin(self) -> int:
if self.min_stack:
return self.min_stack[-1]
__init__ method initializes main_stack and min_stack as empty lists.push(val: int) -> None:
val to main_stack.min_stack is empty or val is less than or equal to the current minimum (top of min_stack), it adds val to min_stack.pop() -> None:
main_stack.min_stack, it removes the top element from min_stack as well.top() -> int:
main_stack.getMin() -> int:
min_stack, which is the current minimum in the stack.This implementation ensures that all operations (push, pop, top, and getMin) are performed in constant time O(1).