Min Stack
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.Last updated
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.Last updated
入栈 3
| | | |
| | | |
|_3_| |_3_|
stack minStack
入栈 5 , 5 大于 minStack 栈顶,不处理
| | | |
| 5 | | |
|_3_| |_3_|
stack minStack
入栈 2 ,此时右边的 minStack 栈顶就保存了当前最小值 2
| 2 | | |
| 5 | | 2 |
|_3_| |_3_|
stack minStack
出栈 2,此时右边的 minStack 栈顶就保存了当前最小值 3
| | | |
| 5 | | |
|_3_| |_3_|
stack minStack
出栈 5,右边 minStack 不处理
| | | |
| | | |
|_3_| |_3_|
stack minStack
出栈 3
| | | |
| | | |
|_ _| |_ _|
stack minStack
作者:windliang
链接:https://leetcode-cn.com/problems/min-stack/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-38/class MinStack {
Stack<Integer> stack, minStack;
public MinStack() {
stack = new Stack<Integer>();
minStack = new Stack<Integer>();
}
public void push(int x) {
stack.push(x);
if (!minStack.isEmpty()) {
//"<=" for duplicate numbers
if (x <= minStack.peek()) minStack.push(x);
} else {
minStack.push(x);
}
}
public void pop() {
int x = stack.pop();
if (!minStack.isEmpty()) {
if (x == minStack.peek()) minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int getMin() {
if (!minStack.isEmpty()) return minStack.peek();
else return stack.peek();
}
}入栈 3,3比MAX_INTEGER小,把max和3依次push进去,min=3
| |
| |
| 3 |
|MAX|
stack
入栈 5,5 大于 min,直接push进去5,min=3
| |
| 5 |
| 3 |
|MAX|
stack
入栈 2 ,2比min小,先把min=3 push进去,再push2,min=2
| 2 |
| 3 |
| 5 |
| 3 |
|MAX|
stack
出栈 2,pop出来的值2等于min,则需要再pop一次出来3,更新min=3
| 5 |
| 3 |
|MAX|
stack
出栈 5
| |
| 3 |
|MAX|
stack
出栈 3
| |
| |
|MAX|
stack class MinStack {
Stack<Integer> stack;
int min;
public MinStack() {
stack = new Stack<Integer>();
min = Integer.MAX_VALUE;
}
public void push(int x) {
if (x <= min) {
stack.push(min); //在stack上加一个当前的最小数
min = x; //更新最小数
}
stack.push(x);
}
//if pop out the min, set the min to be the second smallest
public void pop() {
if (min == stack.pop()) min = stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return min;
}
}