JZ30. 包含min函数的栈


1. 题目

[原题链接]定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数,在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

示例

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

提示:各函数的调用总次数不超过 20000 次

注意:本题与LeetCode主站 155 题相同:https://leetcode-cn.com/problems/min-stack/


2. 思路

  • 若每次压入一个新元素进栈时,将栈里的所有元素排序,让最小的元素位于栈顶,就能在O(1)时间内得到最小元素。但是这样破坏了栈的数据结构,不能保证最后压入栈的元素能够最先出栈。
  • 若在栈里添加一个成员变量存放最小的元素,每次压入一个新元素进栈的时候更新最小元素,也能在O(1)时间内得到最小元素。但是这样如果当前最小的元素被弹出栈了,无法得到下一个最小元素。

所以我们不仅希望得到最小元素,还希望得到次小元素,自然地想到用一个辅助栈来存放每次的最小元素,来实现 O(1) 复杂度的min函数。过程可以先通过一个具体的例子来理解。
在这里插入图片描述

所以数据栈用于保持栈的原始正常逻辑;辅助栈用于存储数据栈中所有非严格降序的元素,使最小元素永远位于辅助栈的栈顶。在定义pop()函数时注意保持两个栈元素的一致性:当最小元素从数据栈内被弹出之后,同时弹出辅助栈的栈顶元素,保证辅助栈的新栈顶元素就是下一个最小值。


3. 实现

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.A, self.B = [], []


    def push(self, x: int) -> None:
        self.A.append(x)
        if not self.B or self.B[-1] >= x:
            self.B.append(x)


    def pop(self) -> None:
        if self.A.pop() == self.B[-1]:
            self.B.pop()


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


    def min(self) -> int:
        return self.B[-1]



# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.min()

4. 其它

  • 题目难度:简单
  • 相关题目:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值