image.png

方法一:使用辅助栈

思路:类中使用两个栈,一个栈用于保存所有被推入的元素。同时,另一个栈用于记录入栈时,栈中的最小值。

  1. class MinStack {
  2. minStack: number[];
  3. stack: number[];
  4. constructor() {
  5. this.minStack = [Infinity];
  6. this.stack = [];
  7. }
  8. push(x: number): void {
  9. this.stack.push(x)
  10. this.minStack.push(Math.min(x, this.minStack[this.minStack.length -1]))
  11. }
  12. pop(): void {
  13. this.stack.pop()
  14. this.minStack.pop()
  15. }
  16. top(): number {
  17. return this.stack[this.stack.length - 1]
  18. }
  19. getMin(): number {
  20. return this.minStack[this.minStack.length - 1]
  21. }
  22. }

方法二:仅使用一个栈

方法一使用辅助栈的话,内部是需要使用两个栈的(使用辅助栈记录最小值)。如果我们仅用一个变量 min 去记录最小值的时候,如果 min 变更,那么原来 min 就会丢失,因此需要找一个地方能够存储老的 min

当变更 min 时,我们可以将原来的 min 也存入的栈中即可:

  1. class MinStack {
  2. min: number;
  3. stack: number[];
  4. constructor() {
  5. this.min = Infinity;
  6. this.stack = [];
  7. }
  8. push(x: number): void {
  9. // 如果 x 比 min 小,那么将原来的 min 先推入栈中,然后更新 min
  10. if (x <= this.min) {
  11. this.stack.push(this.min);
  12. this.min = x;
  13. }
  14. this.stack.push(x);
  15. // 经过上面的逻辑,此时 x 在栈顶,而原来的 min 则在栈的倒数第二个位置
  16. }
  17. pop(): void {
  18. // 如果栈顶为最小值,那么倒数第二个位置记录的是原来的 min
  19. // 因此进行 pop 操作之后,也需要将 min 还原为原来的值
  20. if (this.stack.pop() === this.min) {
  21. this.min = this.stack.pop() as number;
  22. }
  23. }
  24. top(): number {
  25. return this.stack[this.stack.length - 1];
  26. }
  27. getMin(): number {
  28. return this.min;
  29. }
  30. }