155. 最小栈 - 力扣(LeetCode)
发布:2021年9月22日17:29:18
问题描述及示例
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x)
—— 将元素 x 推入栈中。
pop()
—— 删除栈顶的元素。
top()
—— 获取栈顶元素。
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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
提示:
pop、top 和 getMin 操作总是在 非空栈 上调用。
我的题解
不久前我写过一个用JavaScript中的Map类型数据来实现栈结构的博客(不过和本题没啥关系就是了):
但是本题的重点在于如果在常数时间内获取栈中的最小值,那就意味着不能在调用 getMin()
函数时临时对栈中的数据进行大小排序从而获得最小值。于是我就想到额外用一个专门的数组来保存当前 MinStack
实例中的“历届”最小值的下标。这个数组的尾部存储的就是当前这个 MinStack
实例中的“现任”最小值的下标。
详细解释请看下方注释:
/**
* initialize your data structure here.
*/
var MinStack = function() {
// stack属性在MinStack实例中充当真正的栈结构
this.stack = [];
// min属性也是一个栈结构,但是其中保存的是MinStack实例中“历届”最小值的下标,
// 所以min中的值越靠近栈顶就越小,而栈顶元素存储的就是MinStack实例“现任”最小值的下标
this.min = [];
};
/**
* @param {number} val
* @return {void}
*/
MinStack.prototype.push = function(val) {
// 往MinStack实例中压入元素,实际是存储到stack属性中的
this.stack.push(val);
// 如果当前实例的min栈为空,或者当前压入的元素比当前实例中的最小值还要小
if(!this.min.length || val < this.stack[this.min[this.min.length-1]]) {
// 那么就要更新当前MinStack实例中的最小值的指向,宣布新的最小值诞生了
this.min.push(this.stack.length-1);
}
};
/**
* @return {void}
*/
MinStack.prototype.pop = function() {
// 如果弹出的栈顶元素恰好是当前的最小值,
if(this.min[this.min.length-1] === this.stack.length-1) {
// 那么就要把min栈顶保存的那个下标给弹出去
this.min.pop();
}
// stack则照常该干嘛就干嘛
this.stack.pop();
};
/**
* @return {number}
*/
MinStack.prototype.top = function() {
// 栈顶元素就是stack属性中的末尾元素
return this.stack[this.stack.length - 1];
};
/**
* @return {number}
*/
MinStack.prototype.getMin = function() {
// 当前MinStack实例中的最小值的下标就是该实例的min中栈顶所保存的那个下标
return this.stack[this.min[this.min.length-1]];
};
提交记录
执行结果:通过
31 / 31 个通过测试用例
执行用时:112 ms, 在所有 JavaScript 提交中击败了71.14%的用户
内存消耗:44.8 MB, 在所有 JavaScript 提交中击败了68.48%的用户
时间:2021/09/22 17:33
因为题目要求要在常数时间内找到栈中的最小值,所以就特意额外用了一个数组来保存历来的最小值,这是一种典型的用时间来换空间的做法。
官方题解
更新:2021年7月29日18:43:21
因为我考虑到著作权归属问题,所以【官方题解】部分我不再粘贴具体的代码了,可到下方的链接中查看。
更新:2021年9月22日17:34:17
【更新结束】
有关参考
更新:2021年9月22日17:36:06
参考:【JavaScript-Map】JavaScript用Map类型对象实现栈结构_赖念安的博客-CSDN博客