一、最小栈
本题要求我们实现一个最小栈数据结构,要求它可以实现栈的基本功能,并且还能使用常数时间复杂度来获取栈中的最小值。
1.辅助栈
我们可以在普通栈的基础上再添加一个维护最小值的辅助栈来实现这个数据结构,我们先创建一个普通的栈来完成栈的基本操作,再创建一个辅助栈,这个辅助栈中用来存放最小值,在我们往栈中存值的时候,如果存入的值比最小栈栈顶的元素还要小,那就把这个值在普通栈和辅助栈中都存入一个,如果存入的值比辅助栈栈顶的值大,那么我们在普通栈中存入这个值,再将辅助栈栈顶的元素再复制一份存入辅助栈,当我们需要弹出值时,就同时弹出普通栈和辅助栈的栈顶,这样辅助栈中就时刻维护着最小的元素了,具体代码如下:
class MinStack {
public Stack<Integer> sta;
public Stack<Integer> min;
public MinStack() {
sta = new Stack<>();
min = new Stack<>();
}
public void push(int val) {
if(sta.empty()) {
sta.push(val);
min.push(val);
} else {
if(val < min.peek()) {
sta.push(val);
min.push(val);
} else {
sta.push(val);
min.push(min.peek());
}
}
}
public void pop() {
sta.pop();
min.pop();
}
public int top() {
return sta.peek();
}
public int getMin() {
return min.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
复杂度分析
- 时间复杂度:O(1)。
- 空间复杂度:O(n)。