设计思路:
最开始想到的是使用一个变量记录最小值,如果最小值弹出了,那么就要寻找新的最小值,寻找新的最小的时间复杂度就不是o(1)了。
想到可以增加一个最小值栈,在push数据的时候,和最小值栈顶的数据进行比较,如果比栈顶的数据小或者相等就压栈,如果比栈顶的元素大就丢掉。一个存储所有元素的栈和一个存储压栈过程中产生的最小值栈。这里使用了空间换时间的思想,最小值栈保证在push和pop的过程中,栈顶元素始终都是最小的。
java代码实现:
import java.util.Stack;
public class MinStack {
private Stack stack = new Stack();
private Stack minStack = new Stack();
public void push(int ele){
stack.push(ele);
if(minStack.isEmpty()){
minStack.push(ele);
}else {
int top = (int) minStack.peek();
//可能再次加入最小值,也要再次加入到minStack中
if (ele <= top) {
minStack.push(ele);
}
}
}
public int pop() throws Exception {
if(stack.isEmpty()){
throw new Exception("栈为空");
}
int top = (int)stack.pop();
if(top==(int)minStack.peek()){
minStack.pop();
}
return top;
}
public int min() throws Exception {
if (minStack.isEmpty()) {
throw new Exception("栈为空");
}
return (int)minStack.peek();
}
//测试代码
public static void main(String[] args) throws Exception {
MinStack min = new MinStack();
min.push(2);
System.out.println(min.min());
min.push(6);
min.push(1);
System.out.println(min.min());
min.push(7);
System.out.println(min.pop());
System.out.println(min.min());
min.push(1);
min.push(1);
min.push(1);
min.pop();
System.out.println(min.min());
min.pop();
System.out.println(min.min());
min.pop();
System.out.println(min.min());
min.pop();
System.out.println(min.min());
}
}
基础知识:
这道算法题的基础是栈,还有空间换时间的思想,想一次就把代码写对,也挺不容易的。
我们复习一下栈的基础知识:
栈底层可以使用链表实现,也可以使用数组实现。jdk8中的栈使用了数组实现。
栈中比较重要的方法有peek,pop,push,empty。peek和pop方法要重点区分一下,peek在英文中是偷看,窥视; 眯着眼睛看的意思,只是查看栈顶元素,并不弹出栈顶元素。