LeetCode热题(JS版) - 155. 最小栈

119 阅读2分钟

题目

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

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

解题思路

这道题需要我们设计一个支持 pushpoptopgetMin 操作的栈。其中 pushpoptop 操作比较简单,而 getMin 操作需要我们在常数时间内获取栈中的最小元素。

为了实现这个需求,我们可以使用两个栈来实现:

  • 一个普通栈用于存储元素
  • 另一个栈用于存储当前栈中的最小值

具体来说:

  • 压入元素时,如果该元素比当前最小值要小,则将其同时压入最小值栈中。
  • 弹出栈顶元素时,如果该元素等于最小值栈中的栈顶元素,则将其同时弹出最小值栈中。这样,在获取最小值的时候,只需要返回最小值栈中的栈顶元素即可。

下面是该算法的 JavaScript 实现:

class MinStack {
  private stack: number[];
  private minStack: number[];

  constructor() {
      this.stack = [];
      this.minStack = [Infinity];
  }

  push(x: number): void {
      this.stack.push(x);
      this.minStack.push(Math.min(this.minStack[this.minStack.length - 1], x));
  }

  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];
  }
}

image.png

算法分析

  • 时间复杂度:O(1)O(1),对于所有操作,我们都只对两个栈进行了常数次操作,因此时间复杂度为 O(1)。
  • 空间复杂度:O(N)O(N),空间复杂度取决于栈中元素的数量,因此空间复杂度为 O(N)。

总结

本文介绍了Leetcode第155题的解法,通过使用两个栈实现了支持 push、pop、top 和 getMin 操作的栈。该算法时间复杂度为O(1),空间复杂度为O(N)。