返回
构建极致栈:力扣第 155 题详解
后端
2023-09-24 08:33:47
简介:
力扣第 155 题:最小栈,要求我们实现一个带有查找最小值功能的栈。它不仅是一个数据结构的考察,更涉及到算法设计和时间复杂度优化,颇具挑战性。
一、剖析问题:
首先,我们需要明确问题的核心需求:设计一个栈,能在常数时间内完成两个操作——入栈和找到栈中的最小值。常数时间意味着操作的时间复杂度不受元素个数的影响,即使面对庞大的栈,也能保持快速响应。
二、最优解法:
最优解法是利用两个栈来实现最小栈。第一个栈用于存储数据,就像普通的栈一样。第二个栈专门用来存储最小值,它始终维护着当前栈中的最小值。
三、具体实现:
-
入栈:
- 当向栈中插入一个元素时,将其压入数据栈。
- 同时,将该元素与当前最小栈栈顶元素进行比较,如果该元素更小,则将其压入最小栈。
-
出栈:
- 当从栈中弹出一个元素时,将其从数据栈中弹出。
- 如果被弹出的元素也是最小栈栈顶元素,则同时将其从最小栈中弹出。
-
获取最小值:
- 要查找栈中的最小值,只需返回最小栈栈顶元素即可。
四、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 题——最小栈,考察了数据结构和算法设计的综合能力。通过构建两个栈来实现最小栈,我们实现了常数时间内查找最小值的功能。这种方法不仅巧妙,而且高效,充分体现了算法设计的精髓。