题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min、push及pop的时间复杂度都是o(1)
问题分析:
最直接的思路:每次有一个元素进栈都进行一次排序,使最小的元素始终位于栈顶,可以在O(1)时间内找到最小元素。但是该方法不能保证“先进后出”的栈的特性。
推荐解法:使用一个辅助栈mins存放每一次入栈操作的最小元素,min()函数直接从辅助栈mins的栈顶进行弹出操作,在O(1)
时间内完成,以空间换时间。当最小元素从原数据栈data内被弹出时,同时弹出辅助栈mins内的栈顶元素,则mins辅助栈的新的栈顶元素就是下一个最小值。
代码如下:
/**
* 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
* 要求在该栈中,调用min push pop的时间复杂度都是O(1)
*/
import java.util.Stack;
public class MinStack {
Stack<Integer> data = new Stack<Integer>(); // 数据栈
Stack<Integer> mins = new Stack<Integer>(); // 辅助栈,存放最小值
Integer tmpMin = null;
// 数据进栈,最小值进栈
public void push(int node) {
if(tmpMin == null) {
tmpMin = node;
data.push(node);
mins.push(node);
} else {
if(node <= tmpMin) {
tmpMin = node;
mins.push(node);
}
data.push(node);
}
}
// 弹出栈顶元素
public void pop() {
int num1 = data.pop();
int num2 = mins.pop();
if(num1 != num2)
mins.push(num2);
}
// 查看栈顶元素
public int top() {
int num = data.pop();
data.push(num);
return num;
}
// 查看当前最小元素
public int min() {
int num = mins.pop();
mins.push(num);
return num;
}
}