Solution 1Two Stack
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
class MinStack:
def __init__(self):
self.minStack = []
self.stack = []
def push(self, val: int) -> None:
self.stack.append(val)
if self.minStack:
self.minStack.append(min(self.minStack[-1], val))
else:
self.minStack.append(val)
def pop(self) -> None:
self.stack.pop(-1)
self.minStack.pop(-1)
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.minStack[-1]// Typical Solution
// // This solution can be considered as optimized for interview purposes, but for competitive coding level use ListNode solution.
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
class MinStack2 {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack2() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int val) {
stack.push(val);
if (minStack.isEmpty()) {
minStack.push(val);
} else {
minStack.push(Math.min(val, minStack.peek()));
}
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minStack.peek();
}
}Solution 2Linked List Rescan
Java
// // Competitive level optimized solution, kind of overkill for real world scenarios
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
class MinStack {
ListNode list;
int min = Integer.MAX_VALUE;
public MinStack() {
list = null;
}
public void push(int val) {
min = Math.min(val, min);
ListNode node = new ListNode(val, list);
list = node;
}
public void pop() {
int val = list.val;
list = list.next;
if(val == min) {
min = Integer.MAX_VALUE;
ListNode dummy = list;
while(dummy != null) {
min = Math.min(min, dummy.val);
dummy = dummy.next;
}
}
}
public int top() {
return list.val;
}
public int getMin() {
return min;
}
}