categories: [Blog,Algorithm]


155. 最小栈

难度简单820
设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。


    示例:
    输入:
    [“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.


提示:

  • poptopgetMin 操作总是在 非空栈 上调用。
  1. class MinStack {
  2. Deque<Integer> xStack;
  3. Deque<Integer> minStack;
  4. public MinStack() {
  5. xStack = new LinkedList<Integer>();
  6. minStack = new LinkedList<Integer>();
  7. minStack.push(Integer.MAX_VALUE);//
  8. }
  9. public void push(int x) {
  10. xStack.push(x);
  11. minStack.push(Math.min(minStack.peek(), x));
  12. }
  13. public void pop() {
  14. xStack.pop();
  15. minStack.pop();
  16. }
  17. public int top() {
  18. return xStack.peek();
  19. }
  20. public int getMin() {
  21. return minStack.peek();
  22. }
  23. // 作者:LeetCode-Solution
  24. // 链接:https://leetcode-cn.com/problems/min-stack/solution/zui-xiao-zhan-by-leetcode-solution/
  25. }
  26. /**
  27. * Your MinStack object will be instantiated and called as such:
  28. * MinStack obj = new MinStack();
  29. * obj.push(x);
  30. * obj.pop();
  31. * int param_3 = obj.top();
  32. * int param_4 = obj.getMin();
  33. */

解析

辅助栈
要做出这道题目,首先要理解栈结构先进后出的性质。
对于栈来说,如果一个元素 a 在入栈时,栈里有其它的元素 b, c, d,那么无论这个栈在之后经历了什么操作,只要 a 在栈中,b, c, d 就一定在栈中,因为在 a 被弹出之前,b, c, d 不会被弹出。
因此,在操作过程中的任意一个时刻,只要栈顶的元素是 a,那么我们就可以确定栈里面现在的元素一定是 a, b, c, d。
那么,我们可以在每个元素 a 入栈时把当前栈的最小值 m 存储起来。在这之后无论何时,如果栈顶元素是 a,我们就可以直接返回存储的最小值 m。
image.png