【算法-LeetCode】155. 最小栈(栈;数组)

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类型数据来实现栈结构的博客(不过和本题没啥关系就是了):

参考:【JavaScript-Map】JavaScript用Map类型对象实现栈结构_赖念安的博客-CSDN博客

但是本题的重点在于如果在常数时间内获取栈中的最小值,那就意味着不能在调用 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

参考:最小栈 - 最小栈 - 力扣(LeetCode)

【更新结束】

有关参考

更新:2021年9月22日17:36:06
参考:【JavaScript-Map】JavaScript用Map类型对象实现栈结构_赖念安的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值