题目描述

image.png

解题思路

辅助栈

和此题一样https://www.yuque.com/jugelizi-rxt6d/dqbihl/iac9ha
但也可以写成这样:
每次放入栈,同步的把最小值放入,就算重复也放入,注意同步!!!
image.png
155. 最小栈 - 图3

  1. class MinStack {
  2. Stack<Integer> stack;
  3. Stack<Integer> minStack;
  4. public MinStack() {
  5. stack = new Stack<>();
  6. minStack = new Stack<>();
  7. minStack.push(Integer.MAX_VALUE);
  8. }
  9. public void push(int val) {
  10. stack.push(val);
  11. // 比较放入最小的值
  12. minStack.push(Math.min(minStack.peek(), val));
  13. }
  14. public void pop() {
  15. stack.pop();
  16. minStack.pop();
  17. }
  18. public int top() {
  19. return stack.peek();
  20. }
  21. public int getMin() {
  22. return minStack.peek();
  23. }
  24. }

image.png

差值法

使用了1个辅助栈,保存最小值,怎么可以实现不使用额外的空间呢?
栈保存差值,而使用一个变量来记录最小值,但需要注意出栈的时候,出栈需要对差值进行判断,如果diff小于0,那么min需要更新,大于0也需要更新。

  1. /**
  2. * stack用来存储和min的差值,min存储最小值,每次出栈的时候通过差值和当前min计算要出栈的值和之前的min
  3. * 如果差值diff大于等于0,说明要出栈的值大于等于当前min,那么要出栈的值在入栈的时候没有更新min,返回min+diff;
  4. * 如果差值diff小于0,说明当前要出栈的值就是min(因为入栈的时候我们选择的就是min和入栈元素的最小值),同时,通过min-diff计算出之前min
  5. * 要注意的是diff可能会超出int范围,类似于 Integer.MAX_VALUE - 1 这种,所以diff要用Long存
  6. */
  7. class MinStack {
  8. Integer min = null;
  9. Stack<Long> stack; // 保存差值,使用Long,防止越界
  10. public MinStack() {
  11. stack = new Stack<>();
  12. }
  13. public void push(int val) {
  14. if (stack.isEmpty()) {
  15. // 第一个数min=x,差值为0
  16. stack.push(0L);
  17. min = val;
  18. }else {
  19. stack.push(Long.valueOf(val) - min);
  20. min = Math.min(val, min);
  21. }
  22. }
  23. public void pop() {
  24. Long diff = stack.pop();
  25. if (diff < 0) {
  26. // 如果弹栈的小于min,那须需要把差值加上去,因为在放入的时候
  27. min = (int)(min - diff);
  28. }
  29. }
  30. public int top() {
  31. Long diff = stack.peek();
  32. if (diff >= 0) {
  33. return (int) (diff + min);
  34. }else {
  35. return min;
  36. }
  37. }
  38. public int getMin() {
  39. return min;
  40. }
  41. }