返回

构建极致栈:力扣第 155 题详解

后端

简介:

力扣第 155 题:最小栈,要求我们实现一个带有查找最小值功能的栈。它不仅是一个数据结构的考察,更涉及到算法设计和时间复杂度优化,颇具挑战性。

一、剖析问题:

首先,我们需要明确问题的核心需求:设计一个栈,能在常数时间内完成两个操作——入栈和找到栈中的最小值。常数时间意味着操作的时间复杂度不受元素个数的影响,即使面对庞大的栈,也能保持快速响应。

二、最优解法:

最优解法是利用两个栈来实现最小栈。第一个栈用于存储数据,就像普通的栈一样。第二个栈专门用来存储最小值,它始终维护着当前栈中的最小值。

三、具体实现:

  1. 入栈:

    • 当向栈中插入一个元素时,将其压入数据栈。
    • 同时,将该元素与当前最小栈栈顶元素进行比较,如果该元素更小,则将其压入最小栈。
  2. 出栈:

    • 当从栈中弹出一个元素时,将其从数据栈中弹出。
    • 如果被弹出的元素也是最小栈栈顶元素,则同时将其从最小栈中弹出。
  3. 获取最小值:

    • 要查找栈中的最小值,只需返回最小栈栈顶元素即可。

四、JavaScript 代码实现:

class MinStack {
    constructor() {
        this.dataStack = [];
        this.minStack = [];
    }

    push(val) {
        this.dataStack.push(val);
        if (this.minStack.length === 0 || val <= this.minStack[this.minStack.length - 1]) {
            this.minStack.push(val);
        }
    }

    pop() {
        const val = this.dataStack.pop();
        if (val === this.minStack[this.minStack.length - 1]) {
            this.minStack.pop();
        }
        return val;
    }

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

五、时间复杂度:

该解法的入栈和出栈操作都可以在常数时间内完成,因为它们只需要对栈顶元素进行操作。获取最小值操作的时间复杂度也是常数,因为只需要访问最小栈的栈顶元素。

六、总结:

力扣第 155 题——最小栈,考察了数据结构和算法设计的综合能力。通过构建两个栈来实现最小栈,我们实现了常数时间内查找最小值的功能。这种方法不仅巧妙,而且高效,充分体现了算法设计的精髓。