Description
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.
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:
Methods pop
, top
and getMin
operations will always be called on non-empty stacks.
Solution
On the stack, use a node which contains the number and the min value.
class MinStack {
/** initialize your data structure here. */
private Stack<Node> stack;
public MinStack() {
stack = new Stack<Node>();
}
private static class Node {
private int x, min;
private Node(int x, int min) {
this.x = x;
this.min = min;
}
}
public void push(int x) {
if (stack.empty()) {
stack.push(new Node(x, x));
}
else {
stack.push(new Node(x, Math.min(x, getMin())));
}
}
public void pop() {
stack.pop();
}
public int top() {
return stack.peek().x;
}
public int getMin() {
return stack.peek().min;
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/