最小栈
一、最小栈
1.方法概述
- 总体思想就是,初始化两个栈,一个是存放入栈元素的stack栈,另一个是存放最小元素的minStack栈。当两个初始化栈都存放了第一个元素后,再对入栈元素进行判断,在stack栈存放完第二个元素后,如果该元素比minStack的栈顶元素小就存放入minStack栈中,否则就不存入minStack中。当元素全部入栈后,minStack栈的栈顶元素就是stack栈中的最小元素。
2.具体实现
java版本方法
点击查看代码
class MinStack {
private Stack<Integer> stack;
private Stack<Integer> minStack;
public MinStack(){
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int val) {
stack.push(val);
if(minStack.empty()){
minStack.push(val);
}else{
int top = minStack.peek();
if(val <= top){
minStack.push(val);
}
}
}
public void pop() {
int val = stack.pop();
if(!minStack.empty()){
int top = minStack.peek();
if(val == top){
minStack.pop();
}
}
}
public int top() {
if(stack.empty()){
return -1;
}
return stack.peek();
}
public int getMin() {
if(minStack.empty()){
return -1;
}
return minStack.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
3.要点总结
- 本题的的要求要在常数时间内找到该最小元素也就是时间复杂度为O(1),如果只有一个栈的话最坏情况下时间复杂度是O(n)并不符合题目要求。并且如果用一个变量min存储当前最小元素,那么在stack进行pop操作后,变量min存储的值将不再是最小值。所以首先考虑使用两个栈一个用来存放最小元素,另一个存放入栈元素。
- 在pop操作是在当stack栈和minStack栈的栈顶元素相等时同时弹出,否则只弹出stack栈的栈顶元素。
- 在push操作时,需要注意的一点是入栈元素val不能只取小于minStack栈的栈顶元素top的值,等于情况下也需要存放入minStack栈,因为pop操作时,当是最小元素时两栈的元素是同时出的,如果不存入,则minStack栈中较stack栈中的最小元素就会缺少,可能会导致在pop操作后无法在时间复杂度为O(1)的情况下找出最小元素。

仅供个人参考,欢迎批评指正!

最小栈方法要点总结
浙公网安备 33010602011771号