虽然在面试宝典中,声称这是一个用O(1)时间复杂度实现求栈中最小元素的解法。
但是,不管怎么说还是遍历了栈,我不承认。
/**
*
*/
package dianer;
import java.util.Stack;
/**
* * @author LilyLee
* @date 2017年3月19日
* @Version
*题目:来自《面试宝典》
*如何使用O(1)的时间复杂度求栈中最小元素
*
*【然而我觉得这个有点儿伪命题的感觉】
*【无论如何还是要过一遍全部元素,有区别吗?】
*/
/*
* 因为栈的push和pop操作都是针对栈顶元素的,
* 所以一般如果想要获得最小元素,需要遍历栈中所有元素找出最小值,这样的话时间复杂度是O(n)。
*
* 所以想要减小时间复杂度,需要 “空间换时间”、
*
* 具体而言:
* 定义一个主栈和一个辅栈,
* 主栈执行的是push压栈的操作, 用一个min来记录当前的最小值,
* 用一个辅栈来保存最小元素,保证辅栈的栈顶元素始终为最小值。
*
*
* */
public class min_Stack {
private Stack<Integer> stack=new Stack<Integer>();
private Stack<Integer> minStack=new Stack<Integer>();
public static void main(String[] args) throws Exception {
min_Stack minstack=new min_Stack();
minstack.push(3);
minstack.push(4);
minstack.push(9);
System.out.println("min="+minstack.min());
}
public void push(int data){
stack.push(data);
if(minStack.size()==0 || minStack.peek()>data)
minStack.add(data);
else{
int date=minStack.peek();
minStack.add(date);
}
}
public int pop() throws Exception{
if(stack.size()==0){return Integer.MAX_VALUE;}
int data=stack.pop();
int mindata=minStack.pop();
return data;
}
public Object min() throws Exception{
if(minStack.size()==0){return null;}
return minStack.peek();
}
}