最小栈 1.题目 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。
示例 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/min-stack 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.分析
使用辅助栈的方法,把每次插入最小的放入辅助栈,需要最小的就peek辅助栈栈顶,需要pop就看是否是辅助栈栈顶元素,若是辅助栈也要一并pop出来
3.代码 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 class MinStack { private Stack<Integer> stack; private Stack<Integer> min_stack; public MinStack () { stack = new Stack<>(); min_stack = new Stack<>(); } public void push (int x) { stack.push(x); if (min_stack.isEmpty() || x <= min_stack.peek()) min_stack.push(x); } public void pop () { int temp = stack.pop(); if (temp==min_stack.peek()){ min_stack.pop(); } } public int top () { return stack.peek(); } public int getMin () { return min_stack.peek(); } }