LeetCode:155.最小栈(简单) | 刷题打卡

264 阅读2分钟

题目描述

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。

来源:力扣(LeetCode)

示例:

输入:
["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.

提示:

  • poptopgetMin 操作总是在 非空栈 上调用

题目分析

这道题要运用到栈的相关知识,题目首先创建一个栈,然后push(-2)是将-2压入栈中,push(0)是将0压入栈中,push(-3) 是将-3压入栈中,然后调用 getMin( ) 方法返回栈中的最小元素-3,接着调用 pop( ) 方法删除栈顶元素,然后调用 top( ) 方法返回栈顶元素0,最后调用getMin( ) 方法返回栈中的最小元素-2。对于前三种操作,现有的栈都支持常数时间复杂度内完成,但是对于 getMin( ) 操作,需要从栈顶到栈底线线扫描一遍,才能得到栈中的最小值,而题目要求在常数时间复杂度,因此我们可以在现有的栈的基础上拓展。

思路分析

按照上面的思路,我们只需要设计一个数据结构,使得每个元素 x 与其相应的最小值 min 时刻保持一一对应。因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。 

  •  当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小 值,将这个最小值插入辅助栈中。

  •  当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出。 

  •  在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中。 

    var MinStack = function() { this.x_stack = []; this.min_stack = [];};MinStack.prototype.push = function(x) { this.x_stack.push(x); this.min_stack.push(Math.min(this.min_stack[this.min_stack.length - 1], x));};MinStack.prototype.pop = function() { this.x_stack.pop(); this.min_stack.pop();};MinStack.prototype.top = function() { return this.x_stack[this.x_stack.length - 1];};MinStack.prototype.getMin = function() { return this.min_stack[this.min_stack.length - 1];};

复杂度分析

  •  时间复杂度:对于题目中的所有操作,时间复杂度均为 O(1)O(1)。因为栈的插入、删除与读取操作都是 O(1)O(1),我们定义的每个操作最多调用栈操作两次。 
  •  空间复杂度:O(n)O(n),其中 nn 为总操作数。最坏情况下,我们会连续插入 nn 个元素,此时两个栈占用的空间为 O(n)O(n)。

总结

本人水平有限,如果觉得这篇 LeetCode 的题解分享还不错,欢迎点赞!

本文正在参与「掘金 3 月闯关活动」,点击查看活动详情