实现一个栈,要求实现该栈的出栈,入栈。返回最小值的时间复杂度为O(1)
解题思路:
两个栈,min是存储最小值的。
有这样一组数据
第一个方法:push方法,往mun里面入栈,5入栈,判断mun有没有数据
同时往两个栈里放数据
7入栈,min里数据比mun里数据小就不用插入数据
下一个数据4,判断有数据 4比5小,放入min
4放入min
同理插入2
之后push完方法。
有 pop方法:出栈
判断栈顶两个是否相等,
相等出栈。不相等左边出栈
比如先插入一个3,3>2,
3先出栈,2不出去
之后2=2,都出栈。4=4出栈。
返回最小值:把2输出就可以,不用出栈。
O(n),级别的复杂度是根据我们的规模来的。
代码实现:
import java.util.Stack;
public class StackMin {
Stack<Integer> num = new Stack<>();
Stack<Integer> min = new Stack<>();
//入栈
public void push(Integer data){
// 首先数据栈一定入栈
num.push(data);
// 判断min栈当中有没有值,如果没有那么就直接写入,如果有那么要比对当前数据和min栈当中栈顶元素的大小
if(min.empty() || data<=min.peek()){//.peek():头部元素
min.push(data);//插入数据
}
}
//出栈
public int pop(){
if (num.peek() == min.peek()){//num的头部元素是否等于min的头部元素
min.pop();
}
return num.pop();
}
//返回最小值
public void min(){
if(!min.empty()){
System.out.println(min.peek());
}
}
}
package duilie;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
StackMin stackMin = new StackMin();
stackMin.push(5);
stackMin.push(7);
stackMin.push(4);
stackMin.push(2);
stackMin.push(0);
stackMin.min();
stackMin.pop();
stackMin.min();
}
}