Using two stacks, one to save elements, and the other to save the minimum. Therefore, there is a mapping between an element and current minimum.
stack min
-1 -1
4 1
3 1
2 1
1 1
for sequence 1 2 3 4 -1.
public class MinStack {
Stack<Integer> s;
Stack<Integer> min;
/** initialize your data structure here. */
public MinStack() {
s = new Stack<>();
min = new Stack<>();
}
public void push(int x) {
s.push(x);
if (min.isEmpty()) {
min.push(x);
} else {
min.push(Math.min(x, min.peek()));
}
}
public void pop() {
if (!s.isEmpty() && !min.isEmpty()) {
s.pop();
min.pop();
}
}
public int top() {
return s.peek();
}
public int getMin() {
return min.peek();
}
}