题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
解题思路:
首先:时间复杂度应为O(1),就是相当于要直接获取到最小值。
(错误方法:一开始是想直接保存一个min,push进来一个值就对比更新min。获取min就直接获取。
结果还是too young too naive。。
pop的时候也要考虑当前最小值呀,当当前当最小值被pop之后,栈里面剩下的元素最小值就不知道了呀:
如:push3,此时min为3
push2,此时min为2
pop,此时min是多少呢?是3吧!
只存一个min,只在push的时候判断是不是最小值,在pop的时候不处理是不行的!!)
那咋办?
只一个min信息太少,pop的时候还想知道剩下的元素里面最小的是哪个。
那就stack里面存一个结构体data包含(当前值node,当前push进栈的最小值min),
这样不就可以O(1)时间复杂度获取当前栈的最小值了嘛
emmm...
果然要时间快一点,就得牺牲空间了
//引入栈数据结构:
import java.util.Stack;
//题解
private class Data{
int node;
int min;
Data(int node, int min){
this.node = node; //保存当前值
this.min = min; //保存当前栈里面最小的值
}
}
private Stack<Data> stack = new Stack();
public void push(int node) {
if(stack.isEmpty()){
Data data = new Data(node,node);
stack.push(data);
}
Data dataTop = stack.peek();
int min = dataTop.min;
if(min > node){//判断栈里面最小的值
min = node;
}
Data dataNew = new Data(node,min);
stack.push(dataNew);
}
public void pop() {
stack.pop();
}
public int top() {
Data data = stack.peek();
return data.node;
}
public int min() {
Data data = stack.peek();
return data.min;
}