资讯专栏INFORMATION COLUMN

LeetCode 155:最小栈 Min Stack

LeexMuller / 3373人阅读

摘要:删除栈顶的元素。可以另外新建一个栈来顺序存入数据最小值。另外在数据入栈时需要判断该值是否比辅助栈的栈顶元素的值更小,如果更小,也应该将它加入辅助栈。并且需要判断辅助栈是否为空,在不空的条件下才可以取栈顶元素比较,否则会溢出。

LeetCode 155:最小栈 Min Stack

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

push(x) -- 将元素 x 推入栈中。

pop() -- 删除栈顶的元素。

top() -- 获取栈顶元素。

getMin() -- 检索栈中的最小元素。

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

push(x) -- Push element x onto stack.

pop() -- Removes the element on top of the stack.

top() -- Get the top element.

getMin() -- Retrieve the minimum element in the stack.

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.
解题思路:

起初我以为定义一个指针指向最小值即可,后面才想到在栈中弹出元素时,如果弹出的元素是最小值,那这个指针就需要更 改选择另一个最小元素。没办法,想做到入栈出栈和弹出最小值均为 O(1) 的时间复杂度,那么只能牺牲空间来换。可以另外新建一个栈来顺序存入数据最小值。

注意:Python中没有多带带的 Stack 数据结构,其实它的数组就有弹出和压入功能。也可以用 collections.deque() 数据结构。 另外在数据入栈时需要判断该值是否比辅助栈的栈顶元素的值更小,如果更小,也应该将它加入辅助栈。并且需要判断辅助栈是否为空,在不空的条件下才可以取栈顶元素比较,否则会溢出。

事实上每次都要调用函数判断是否为空这个操作,相对这道题的运行时间来说很耗时,就这道题而言是可以避免的,只需给辅助栈加入整型最大值作为栈底元素即可。

Java:
class MinStack {
    Stack s1 = new Stack<>();//初始化栈
    Stack s2 = new Stack<>();//辅助栈顺序存入最小值

    public MinStack() {
        s2.push(Integer.MAX_VALUE);//先加入整型最大值在栈底,避免判断辅助栈是否为空
    }

    public void push(int x) {
        s1.push(x);
        if (s2.peek() >= x) s2.push(x);//比栈顶元素值小或相等就加入辅助栈
    }

    public void pop() {
        int tmp = s1.pop();
        if (tmp == s2.peek()) s2.pop();//弹出栈的元素值如果和辅助栈顶元素值相等,也在辅助栈弹出它
    }

    public int top() {
        return s1.peek();//返回栈顶元素
    }

    public int getMin() {
        return s2.peek();//返回辅助栈栈顶元素即是最小值
    }
}
Python3:
class MinStack:
    #初始化数据结构(数组),s2作为辅助栈加入整形最大值做栈底,避免判断辅助栈是否为空
    def __init__(self):
        self.s1 = []
        self.s2 = []
        self.s2.append(sys.maxsize)

    def push(self, x: int) -> None:
        self.s1.append(x)
        #取栈顶元素直接用数组负值索引 Array[-1] 取最后一个值
        if self.s2[-1] >= x: self.s2.append(x)

    def pop(self) -> None:
        tmp = self.s1.pop()
        if tmp == self.s2[-1]: self.s2.pop()

    def top(self) -> int:
        return self.s1[-1]

    def getMin(self) -> int:
        return self.s2[-1]

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75733.html

相关文章

  • 力扣(LeetCode)155

    摘要:题目地址题目描述设计一个支持,,操作,并能在常数时间内检索到最小元素的栈。将元素推入栈中。删除栈顶的元素。示例返回返回返回解答每次入栈都放入两个元素,分别是当前元素,和当前的最小元素因此放入之前需要和当前值进行比较。 题目地址:https://leetcode-cn.com/probl...题目描述:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 p...

    Scliang 评论0 收藏0
  • [Leetcode] Min Stack 最小

    摘要:双栈法复杂度时间空间思路暴力的方法是遍历一遍栈得出最小值,这样不用任何空间。因为这个最小值的顺序也是先进后出,我们同样用一个栈来记录。这样主栈在时,如果该值小于等于副栈顶,就也进副栈中。当主栈时,如果出的元素是副栈栈顶的话,副栈也要。 Min Stack Design a stack that supports push, pop, top, and retrieving themin...

    YorkChen 评论0 收藏0
  • LeetCode 攻略 - 2019 年 7 月上半月汇总(55 题攻略)

    摘要:微信公众号记录截图记录截图目前关于这块算法与数据结构的安排前。已攻略返回目录目前已攻略篇文章。会根据题解以及留言内容,进行补充,并添加上提供题解的小伙伴的昵称和地址。本许可协议授权之外的使用权限可以从处获得。 Create by jsliang on 2019-07-15 11:54:45 Recently revised in 2019-07-15 15:25:25 一 目录 不...

    warmcheng 评论0 收藏0
  • 前端 | 每天一个 LeetCode

    摘要:在线网站地址我的微信公众号完整题目列表从年月日起,每天更新一题,顺序从易到难,目前已更新个题。这是项目地址欢迎一起交流学习。 这篇文章记录我练习的 LeetCode 题目,语言 JavaScript。 在线网站:https://cattle.w3fun.com GitHub 地址:https://github.com/swpuLeo/ca...我的微信公众号: showImg(htt...

    张汉庆 评论0 收藏0
  • [Leetcode] Verify Preorder Sequence in Binary Sear

    摘要:如果继续降序,说明又向左走了,这样等到下次向右走得时候也要再次更新最小值。这样,序列无效的条件就是违反了这个最小值的限定。我们同样可以用本题的方法解,不过是从数组的后面向前面遍历,因为在后面了。栈的增长方向也是从高向低了。 Verify Preorder Sequence in Binary Search Tree Given an array of numbers, verify ...

    未东兴 评论0 收藏0

发表评论

0条评论

LeexMuller

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<