[leetcode] min stack问题

min stack问题

问题描述
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.

Example:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> Returns -3.
minStack.pop();
minStack.top();      --> Returns 0.
minStack.getMin();   --> Returns -2.
实现一个能够返回最小值的栈

leetcode 提交地址

采用额外栈

比较容易想到的是利用一个额外值记录最小值的变化

class MinStack(object):
    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        self.min_stack = []

    def push(self, x):
        """
        :type x: int
        :rtype: void
        """
        if len(self.stack) == 0:
            self.stack.append(x)
            self.min_stack.append(x)
        else:
            self.stack.append(x)
            # 需要注意此处当等于最小值的时候,也需要压入
            if self.min_stack[len(self.min_stack)-1] >= x:
                self.min_stack.append(x)



    def pop(self):
        """
        :rtype: void
        """
        value = self.stack.pop()
        min_value = self.min_stack[len(self.min_stack) -1]
        if value == min_value:
            self.min_stack.pop()
        return value

    def top(self):
        """
        :rtype: int
        """
        return self.stack[len(self.stack)-1]

    def getMin(self):
        """
        :rtype: int
        """
        return self.min_stack[len(self.min_stack) -1]

不采用额外栈

  • 方法一: 当前值比最小值小的时候,需要在更新最小值之前备份一下上一个最小值,由此再该最小值出栈之后,仍能找到上一个最小值。
class MinStack(object):
    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        self.min_num = 0xffffffff

    def push(self, x):
        """
        :type x: int
        :rtype: void
        """
        if x <= self.min_num:
            self.stack.append(self.min_num)  # 相当于备份一下上一个最小值
            self.min_num = x
        self.stack.append(x)

    def pop(self):
        """
        :rtype: void
        """
        if self.stack.pop() == self.min_num:
            self.min_num = self.stack.pop()  #当前最小值已经出栈,返回到前一个最小值,即备份的值

    def top(self):
        """
        :rtype: int
        """
        return self.stack[len(self.stack)-1]

    def getMin(self):
        """
        :rtype: int
        """
        return self.min_num

方法二 利用当前值和最小的值的关系,栈内保存的是当前值和最小值的差,这样当最小值出栈时,能够通过关系找到上一个最小值。这个方法比上一个方法慢,因为需要计算。

class MinStack(object):
    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        self.min_num = 0xffffffff

    def push(self, x):
        """
        :type x: int
        :rtype: void
        """
        if len(self.stack) == 0:
            self.stack.append(0)
            self.min_num = x

        else:
            self.stack.append(x - self.min_num)
            if x < self.min_num:
                self.min_num = x

    def pop(self):
        """
        :rtype: void
        """
        if len(self.stack) == 0:
            return
        value = self.stack.pop()
        if value < 0:
            self.min_num = self.min_num - value


    def top(self):
        """
        :rtype: int
        """
        value = self.stack[len(self.stack)-1]
        if value > 0:
            return self.min_num + value
        else:
            return self.min_num


    def getMin(self):
        """
        :rtype: int
        """
        return self.min_num


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可 6私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值