## Question

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.

__You must implement a solution with O(1) time complexity for each function.__

## Algorithm

By using stack, we could make top, pop and add operation in O(1), the point here is how to make `getMin()`

in O(1).

Normally if we want to find the smallest, we need to traverse the numbers or sort them and get the top one, but those are not O(1) time complexity, so we need to make some extra space for saving time.

So we maintain another stack to track the smallest number and put it on the top of the stack. So the getMin becomes peek the number from minStack.

## Code

class MinStack { Stack<Integer> stack; Stack<Integer> minStack; public MinStack() { stack = new Stack(); minStack = new Stack(); } public void push(int val) { stack.push(val); if (minStack.isEmpty() || val <= minStack.peek()) { minStack.push(val); } } public void pop() { int deleted = stack.pop(); if (deleted == minStack.peek()) { minStack.pop(); } } public int top() { return stack.peek(); } public int getMin() { return minStack.peek(); } } /** * 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(); */