定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
分析
第一遍尝试时忽略了pop操作,pop操作会把最小值弹出。
我这里使用了双栈
- push操作的同时对元素进行检查
- pushMin将最小值更新,保持peek为最小值
- 当使用pop操作时需要检查是否将最小值弹出
- 如果最小值被弹出,min也应该弹出对应值
- min.peek时刻保持当前栈中最小值
注意:本代码忽略当栈为空的时候
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import java.util.Stack;
public class Solution {
private Stack<Integer> min = new Stack(); private Stack<Integer> stack = new Stack(); public void push( int node ){ stack.push(node); pushMin(node); } public void pushMin(int node){ if( min.isEmpty() || node <= min.peek() ){ min.push(node); } } public void popMin( int node ){ if( node == min.peek() ){ min.pop(); } } public int pop(){ int pop = stack.pop(); popMin(pop); return pop; } public int top(){ return stack.peek(); } public int min(){ return min.peek(); } }
|