题目描述
描述:设计一个支持如下操作的栈
- 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;
}
}