题目要求定义一个数据结构,栈,具备进栈出栈和查找当前栈的最小值的方法
刚开始的时候getMin方法我是直接遍历栈中数据,很明显O(N)的查找超市了
那么getMin的方法必须是常量级别的,除了定义个栈之外,
我们另外定义一个最小值栈,其中在最小值栈的栈顶我们保存当前栈的最小值
很明显,我们需要维护最小值栈的栈顶一直是当前栈的最小值,两种操作
1进栈,当最小值栈为空,直接进栈,
当最小值栈的栈顶小于等于入栈的x值时候,最小值栈push(x)
2出栈 当元素X出栈时候,判断X是否等于最小值栈的栈顶,是的话最小值栈栈顶元素出栈
大家可以想象一下进栈出栈的动作,试着理解算法的过程
不过做题的过程,我刚开始是用了LinkedList作为栈,但是OJ竟然判了我Memery 溢出
后来改用了ArrayList竟然Accept了,真心想不明白。。。。。。
class MinStack {
ArrayList<Integer> valueStack = new ArrayList<>(100000);
ArrayList<Integer> minValueStack = new ArrayList<>(100000);
public void push(int x) {
valueStack.add(x);
if(minValueStack.isEmpty()) minValueStack.add(x);
else if(x <= minValueStack.get(minValueStack.size() - 1)) minValueStack.add(x);
}
public void pop() {
int value = valueStack.get(valueStack.size() - 1);
valueStack.remove(valueStack.size() - 1);
if(value == minValueStack.get(minValueStack.size() - 1)){
minValueStack.remove(minValueStack.size() - 1);
}
}
public int top() {
return valueStack.get(valueStack.size() - 1);
}
public int getMin() {
return minValueStack.get(minValueStack.size() - 1);
}
}