目录
题目描述
定义栈的数据,请在该类型中实现一个能够找到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。
测试用例
- 新压入栈的数字比之前的最小值大。
- 新压入栈的数字比之前的最小值小。
- 弹出栈的数字不是最小元素。
- 弹出栈的数字是最小元素。
题目考点
- 考察应聘者分析复杂问题的思维能力——举例分析。
- 考察应聘者对栈的理解。
- 栈:先入后出、后入先出
解题思路
这里只限制了时间复杂度,没限制空间复杂度,我们可能会想到用辅助栈(空间角度)。
如表格所示,使用辅助栈,每次把当前栈的最小值压入辅助栈,保证辅助栈的栈顶一直为最小元素。当最小元素从数据栈中弹出,同时弹出辅助栈中的栈顶元素,此时辅助栈的栈顶元素就是下一个栈的最小值。
具体功能函数:push、pop、min
1、min:取辅助栈栈顶元素;
2、push:如果压入的元素比当前最小值小则压入辅助栈,不然再压入一个当前最小值(为了pop的方便);
3、pop:直接弹出数据栈与辅助栈的栈顶元素。
步骤 | 操作 | 数据栈 | 辅助栈(每次把当前栈的最小值压入) | 最小值(辅助栈栈顶) |
---|---|---|---|---|
1 | 压入3 | 3 | 3 | 3 |
2 | 压入4 | 3,4 | 3,3 | 3 |
3 | 压入2 | 3,4,2 | 3,3,2 | 2 |
4 | 压入1 | 3,4,2,1 | 3,3,2,1 | 1 |
5 | 弹出 | 3,4,2 | 3,3,2 | 2 |
6 | 弹出 | 3,4 | 3,3 | 3 |
7 | 压入0 | 3,4,0 | 3,3,0 | 0 |
参考解题
import java.util.Stack;
public class Solution {
// 数据栈
Stack<Integer> dataStack = new Stack<>();
// 辅助栈
Stack<Integer> minStack = new Stack<>();
public void push(int node) {
// 如果压入的元素比当前最小值小则压入辅助栈,
// 不然再压入一个当前最小值(为了pop的方便);
dataStack.push(node);
if(minStack.empty() || node < minStack.peek()){ //empty,true当且仅当此堆栈不包含项目时;
minStack.push(node);
}else{
minStack.push(minStack.peek());
}
}
public void pop() {
// 直接弹出数据栈与辅助栈的栈顶元素。
dataStack.pop();
minStack.pop();
}
public int top() {
return dataStack.peek();
}
public int min() {
// 取辅助栈栈顶元素
return minStack.peek();
}
}