1.问题
如何用O(1)的时间复杂度求栈中最小元素。
2 问题分析:
由于具有先进后出的特点,因此push和pop只需要对栈顶元素进行操作。这样只能访问到栈顶的元素,无法得到栈中的最小的元素。当然可以使用另外一个变量来记录栈底的元素,通过遍历栈中的所有元素找出最小值,但是此种方法的时间复杂度为O(N)。
要想让算法的时间复杂度为O(N),可以采用时间换空间的方式来提高时间的复杂度。也就是说采用额外的存储空间来降低时间的复杂度。
主要思路:使用两个栈结构,一个栈用来存储数据,另外一个栈用来存储栈的最小元素。
1)如果当前入栈的元素比原来栈中的最小值还小,则就把这个值压入到最小元素的栈中。
2)出栈时,如果当前出栈的元素恰好为当前栈中的最小值,保存最小值栈的元素也出栈。使得当前最小值变为当前最小值入栈之前的那个最小值。
3 代码实现
package Stack;
import java.util.Stack;
public class myStack {
private Stack<Integer> stack=new Stack(); //存储元素
private Stack<Integer> minstack=new Stack(); //栈顶永远存储当前stack栈中的最下值
//压栈
void push(int data){
stack.push(data);
if (minstack.empty()){
minstack.push(data);
}else {
if (minstack.peek()>=data){
minstack.push(data);
}
}
}
//弹栈
int pop(){
if (stack.empty()){
System.out.println("栈空");
}
int p=stack.peek();
stack.pop();
if (p==min()){
minstack.pop();
}
return p;
}
int min(){
if (minstack.empty()){
return Integer.MAX_VALUE;
}else {
return minstack.peek();
}
}
public static void main(String[] args) {
myStack myStack=new myStack();
myStack.push(5);
System.out.println("栈中的最小元素"+myStack.min());
myStack.push(6);
System.out.println("栈中的最小元素"+myStack.min());
myStack.push(7);
myStack.push(3);
System.out.println("栈中的最小元素"+myStack.min());
myStack.pop();
System.out.println("栈中的最小元素"+myStack.min());
}
}