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 elementvalonto 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 - 1- Methods
pop,topandgetMinoperations will always be called on non-empty stacks. - At most
3 * 104calls will be made topush,pop,top, andgetMin.
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: This stack stores all the elements.
- Min Stack: This stack keeps track of the minimum elements. Whenever a new element is pushed onto the main stack, it is also pushed onto the min stack if it is less than or equal to the current minimum. When an element is popped from the main stack, it is also popped from the min stack if it is the current minimum.
-
Initialization:
- Create two stacks:
main_stackandmin_stack.
- Create two stacks:
-
Push Operation:
- Push the value onto
main_stack. - If
min_stackis empty or the value is less than or equal to the top ofmin_stack, push the value ontomin_stack.
- Push the value onto
-
Pop Operation:
- Pop the value from
main_stack. - If the popped value is equal to the top of
min_stack, pop it frommin_stack.
- Pop the value from
-
Top Operation:
- Return the top value of
main_stack.
- Return the top value of
-
GetMin Operation:
- Return the top value of
min_stack.
- Return the top value of
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]-
Initialization:
- The
__init__method initializesmain_stackandmin_stackas empty lists.
- The
-
Push Operation:
push(val: int) -> None:- Adds
valtomain_stack. - If
min_stackis empty orvalis less than or equal to the current minimum (top ofmin_stack), it addsvaltomin_stack.
- Adds
-
Pop Operation:
pop() -> None:- Removes the top element from
main_stack. - If this element is the same as the top element of
min_stack, it removes the top element frommin_stackas well.
- Removes the top element from
-
Top Operation:
top() -> int:- Returns the top element of
main_stack.
- Returns the top element of
-
GetMin Operation:
getMin() -> int:- Returns the top element of
min_stack, which is the current minimum in the stack.
- Returns the top element of
This implementation ensures that all operations (push, pop, top, and getMin) are performed in constant time O(1).