
方法一:使用辅助栈
思路:类中使用两个栈,一个栈用于保存所有被推入的元素。同时,另一个栈用于记录入栈时,栈中的最小值。
class MinStack {minStack: number[];stack: number[];constructor() {this.minStack = [Infinity];this.stack = [];}push(x: number): void {this.stack.push(x)this.minStack.push(Math.min(x, this.minStack[this.minStack.length -1]))}pop(): void {this.stack.pop()this.minStack.pop()}top(): number {return this.stack[this.stack.length - 1]}getMin(): number {return this.minStack[this.minStack.length - 1]}}
方法二:仅使用一个栈
方法一使用辅助栈的话,内部是需要使用两个栈的(使用辅助栈记录最小值)。如果我们仅用一个变量 min 去记录最小值的时候,如果 min 变更,那么原来 min 就会丢失,因此需要找一个地方能够存储老的 min 。
当变更 min 时,我们可以将原来的 min 也存入的栈中即可:
class MinStack {min: number;stack: number[];constructor() {this.min = Infinity;this.stack = [];}push(x: number): void {// 如果 x 比 min 小,那么将原来的 min 先推入栈中,然后更新 minif (x <= this.min) {this.stack.push(this.min);this.min = x;}this.stack.push(x);// 经过上面的逻辑,此时 x 在栈顶,而原来的 min 则在栈的倒数第二个位置}pop(): void {// 如果栈顶为最小值,那么倒数第二个位置记录的是原来的 min// 因此进行 pop 操作之后,也需要将 min 还原为原来的值if (this.stack.pop() === this.min) {this.min = this.stack.pop() as number;}}top(): number {return this.stack[this.stack.length - 1];}getMin(): number {return this.min;}}
