题目
思路
左神讲过的经典算法,维护两个栈:
stack
,用来存储数据minStack
,用来存储每个位置情况下的最小值,类似于动态规划。
每次入栈2个元素,一个是入栈的元素本身,一个是当前栈元素的最小值。
直接上例子,一看就明白了。
输入:
["MinStack","push","push","push","push","getMin","pop","getMin","pop","getMin","pop","getMin"]
[[],[2],[0],[3],[0],[],[],[],[],[],[],[]]
预期结果:
[null,null,null,null,null,0,null,0,null,0,null,2]
过程详解:
push/pop 第 0 个元素之后:
stack: 2
minStack: 2
push/pop 第 1 个元素之后:
stack: 2 0
minStack: 2 0
push/pop 第 2 个元素之后:
stack: 2 0 3
minStack: 2 0 0
push/pop 第 3 个元素之后:
stack: 2 0 3 0
minStack: 2 0 0 0
push/pop 第 2 个元素之后:
stack: 2 0 3
minStack: 2 0 0
push/pop 第 1 个元素之后:
stack: 2 0
minStack: 2 0
push/pop 第 0 个元素之后:
stack: 2
minStack: 2
题解
class MinStack {
int pos;
int[] stack; // 普通栈
int[] minStack; // 最小栈,存放当前位置最小值
/**
* initialize your data structure here.
*/
public MinStack() {
stack = new int[10000];
minStack = new int[10000];
pos = -1;
}
public void push(int x) {
pos++;
stack[pos] = x;
if (pos == 0)
minStack[pos] = x;
else
minStack[pos] = minStack[pos - 1] < x ? minStack[pos - 1] : x;
print();
}
public void pop() {
pos--;
print();
}
public int top() {
return stack[pos];
}
public int getMin() {
return minStack[pos];
}
public void print() {
System.out.println("\npush/pop 第 " + pos + " 个元素之后:");
System.out.print("stack:\t\t");
for (int i = 0; i <= pos; i++) {
System.out.print(stack[i] + " ");
}
System.out.println();
System.out.print("minStack:\t");
for (int i = 0; i <= pos; i++) {
System.out.print(minStack[i] + " ");
}
}
}
/**
* 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();
*/