Min Stack
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.
设计一个栈, 支持4种操作: push, pop, top和getMin, 关键是getMin是获取栈中的最小值.
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> Returns -3.
minStack.pop();
minStack.top(); --> Returns 0.
minStack.getMin(); --> Returns -2.
基本代码框架:
class MinStack {
/** initialize your data structure here. */
public MinStack() {
}
public void push(int x) {
}
public void pop() {
}
public int top() {
}
public int getMin() {
}
}
class MinStack {
//存gap, 当前栈顶和之前的最小值的差值
Stack<Long> stack = new Stack<>();
long min = Integer.MIN_VALUE;
public void push(int x) {
if (stack.isEmpty()) {
stack.push(0L);//初始值存0
min = x;
} else {
stack.push(x - min);//存gap
if (x < min) {
min = x;
}
}
}
public void pop() {
if (stack.isEmpty()) {
return;
}
long peek = stack.peek();
if (peek > 0) {
stack.pop();
} else {
min -= peek;
stack.pop();
}
}
public int top() {
if (stack.isEmpty()) {
return -1;
}
if (stack.peek() > 0) {
return (int)(min + stack.peek());
} else {
return (int)min;
}
}
public int getMin() {
return (int) min;
}
}