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.
所以就需要节省空间,不是每次push的时候都push最小值,而是每次最小值发生改变的时候才push。代码如下:
class MinStack {
LinkedList<Integer> stack = new LinkedList<Integer>();
LinkedList<Integer> minStack = new LinkedList<Integer>();
public void push(int x) {
if (x <= getMin()) {
minStack.push(x);
}
stack.push(x);
}
public void pop() {
if (stack.pop() == getMin()) {
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
if (minStack.isEmpty()) {
return Integer.MAX_VALUE;
} else {
return minStack.peek();
}
}
}
但是很有一个更狠的方法,只用一个栈就可以搞定,见下:
class MinStack {
private long min = 0;
private LinkedList<Long> stack = new LinkedList<>();
public void push(int x) {
if (stack.isEmpty()) {
min = x;
stack.push(0L);
} else {
stack.push(x-min);
if (x-min < 0) {
min = x;
}
}
}
public void pop() {
if (stack.peek() < 0) {
min -= stack.peek();
}
stack.pop();
}
public int top() {
if (stack.peek() < 0) {
return (int) min;
}
return (int) (min+stack.peek());
}
public int getMin() {
return (int) min;
}
}
每次并不是push原数据,而是与min坐过差值之后在存放,good idea!!!