zhangdizhangdi

155. 最小栈 🟨

题目

leetcode 中等

题目

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int 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.

题解

两个栈

  • 时间复杂度:O(1)

    所有的 push、pop、top、getMin 操作都没有任何循环遍历,仅仅是数组末尾的操作,绝对的常数时间复杂度。

  • 空间复杂度:O(N)

    我们额外使用了一个 min_stack 数组,最坏情况下保存与数据栈相同数量的元素。这就是典型的“空间换时间”。

js
class MinStack {
  constructor() {
    this.stack = []
    // ‼️ 初始化时放入一个无穷大,可以避免第一次比较时栈为空的判断边界
    this.min_stack = [Infinity]
  }

  push(val) {
    this.stack.push(val)
    const currentMin = Math.min(val, this.min_stack[this.min_stack.length - 1])
    this.min_stack.push(currentMin)
  }

  pop() {
    this.stack.pop()
    this.min_stack.pop()
  }

  top() {
    return this.stack[this.stack.length - 1]
  }

  getMin() {
    return this.min_stack[this.min_stack.length - 1]
  }
}

const minStack = new MinStack()
minStack.push(-2)
minStack.push(0)
minStack.push(-3)
console.log(minStack.getMin())
minStack.pop()
console.log(minStack.top())
console.log(minStack.getMin())
执行结果
-3
0
-2

一个栈存obj

js
class MinStack {
  constructor() {
    this.stack = []
  }

  push(val) {
    if (this.stack.length === 0) {
      // 第一个进来的,它自己就是最小值
      this.stack.push({ val: val, min: val })
    } else {
      // 后续进来的,和前一个状态的最小值去比较
      const currentMin = Math.min(val, this.stack[this.stack.length - 1].min)
      this.stack.push({ val: val, min: currentMin })
    }
  }

  pop() {
    this.stack.pop()
  }

  top() {
    return this.stack[this.stack.length - 1].val
  }

  getMin() {
    return this.stack[this.stack.length - 1].min
  }
}

const minStack = new MinStack()
minStack.push(-2)
minStack.push(0)
minStack.push(-3)
console.log(minStack.getMin())
minStack.pop()
console.log(minStack.top())
console.log(minStack.getMin())
执行结果
-3
0
-2