算法 - Leetcode 155.最小栈

题目描述

描述:设计一个支持如下操作的栈

  • push(x) —— 将元素 x 推入栈中
  • pop() —— 删除栈顶的元素
  • top() —— 获取栈顶元素
  • getMin() —— 检索栈中的最小元素

要求:在常数时间内检索到最小元素

解题思路

因为题目对时间复杂度有要求,所以实现方式只有在元素入栈的时候就记录值的大小并比较,这样才能在常数时间内获取到整个栈的最小值。大体上思路有两种:

  • 使用两个栈,一个常规栈用于存放元素,另一个最小值栈用于记录每次有元素入栈时当前栈内的最小值,在使用getMIn() 方法时只需要将最小值栈的栈顶元素弹出即可
    例如:stack:[-2, 0, 1, -3, 4] minStack:[-2, -2, -2, -3, -3]
  • 使用一个栈,因为 js 中栈是由数组实现的,所以我们可以使用一个二维数组,一个元素分别存当前压入栈的元素值以及当前栈内元素的最小值

实现代码(js)

方法一:

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

  // push(x) 将元素 x 推入栈中
  push(element) {
    this.stack.push(element);
    this.getMinStack.push(
      this.empty() ? element : Math.min(element, this.getMin())
    );
  }

  // pop() 删除栈顶的元素
  pop() {
    this.stack.pop();
    this.getMinStack.pop();
  }

  // top() 获取栈顶元素
  top() {
    if (this.empty()) return null;
    return this.stack[this.stack.length - 1];
  }

  // getMin() 检索栈中的最小元素
  getMin() {
    return this.getMinStack[this.getMinStack.length - 1];
  }

  // empty() 判断栈是否为空栈
  empty() {
    return this.getMinStack.length === 0;
  }
}

方法二:

class MinStack {
  constructor() {
    // 创建栈
    this.stack = [];
  }
  push(x) {
    // val 存放当前元素值,min 存放栈内所有元素的最小值
    this.stack.push({
      val: x,
      min: this.size ? Math.min(x, this.getMin()) : x,
    });
  }
  pop() {
    this.stack.pop();
  }
  top() {
    // top 方法取元素值
    return this.stack[this.size - 1].val;
  }
  getMin() {
    // getMin 方法取最小值
    return this.stack[this.size - 1].min;
  }
  get size() {
    return this.stack.length;
  }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页