题目如下
题目解读
此题要求写一个栈,与普通栈不同的是多出了一个获取最小值的方法。由于栈比较简单,这里就不多说了,主要还是说说怎么以 O(1) 的时间复杂度查找栈中的最小值。
1.使用一个变量 min 记录每次栈中的最小值,每次有元素进栈都对 min 进行更新。
这个方法存在一个问题,没有考虑出栈时,怎么对 min 进行更新。
2.为了解决出栈对最小值的更新,可以设定一个辅助栈,栈顶表示当前数据栈中的最小值,每次有元素入栈,就将当前最小值入辅助栈。出栈时,辅助栈也要将栈顶元素出栈,这就解决了出栈时的最小值更新问题。
push:将数据入栈的同时,更新最小值。如果入栈元素大于辅助栈顶元素(也就是元素入栈前,数据栈中的最小值),则最小值依旧是数据栈原来的最小值,否则将元素入辅助栈。
pop:将数据栈和辅助栈的栈顶元素同时出栈,保持辅助栈的栈顶元素是数据栈中的最小值。
2.题目解法
这里我使用java汇编语言进行解答,代码中的注解详细梳理了我的解答过程
class MinStack {
private Stack<Integer> dataStack; // 数据栈
private Stack<Integer> minStack; // 辅助栈,记录每次有元素进栈后或者出栈后,元素的最小值
/** initialize your data structure here. */
public MinStack() {
// 初始化辅助栈和数据栈
dataStack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
// 如果记录当前数据栈中最小值的辅助栈为空,或者最小值小于 x,则将 x 设置为最小值,即进辅助栈
if(minStack.isEmpty() || minStack.peek() > x){
minStack.push(x);
}else{
// 如果数据栈中当前最小值 < x, 则继续将最小值设置为上次的最小值
minStack.push(minStack.peek());
}
dataStack.push(x);// 数据栈,进栈
}
public void pop() {
minStack.pop();// 辅助栈,栈出栈
dataStack.pop();// 数据栈,出栈
}
public int top() {
return dataStack.peek();
}
public int min() {
return minStack.peek();
}
}
本题引入辅助栈的概念,使题目更好理解,更加方便找出栈中的最小值,就算是出栈的是最小值,也不会影响原本栈中的最小值,起到了实时更新的效果。
测试结果