思路
本题要模拟一个栈,实现出入栈,获取栈顶,获取当前最小值等函数。但是,后面来了一个要求,所有函数的时间复杂度要为o(1),push、pop、top函数使用函数都可以实现o(1)的复杂度,但是min函数一般情况下需要进行排序,所以基本是o(n),所以本题的难点在于怎样将min效率提高到o(1)。
方法很简单:使用双栈,初始化两个栈s1、s2,s1用来实现一般的出入操作,s2用来存储s1中各个元素对应的入栈时栈中的最小值,这样当s1无论是否有最小值弹出,都可以保持现在的最小值。
关键在于如何存储对应的最小值。我们可以在push操作中进行判断,若当前需要压入的元素x小于s2.top值,则压入x,否则将s2.top重复压入一遍。这样,每次进入一个元素,s2就对应地为它记录一个从它到栈底的元素中的最小值。
代码
class MinStack {
/** initialize your data structure here. */
Stack<Integer> s1,s2;
public MinStack() {
s1=new Stack<>();
s2=new Stack<>();
}
public void push(int x) {
s1.push(x);
if(s2.isEmpty()||x<=s2.peek())
s2.push(x);
else s2.push(s2.peek());
}
public void pop() {
s2.pop();
s1.pop();
}
public int top() {
return s1.peek();
}
public int min() {
return s2.peek();
}
}
/**
* 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.min();
*/