"用O(1)的时间复杂度求栈中最小元素"(python)

本文介绍了一种使用两个栈的数据结构,实现O(1)时间复杂度查找栈中最小元素的方法。通过在入栈时比较并更新最小值栈,以及在出栈时同步调整最小值栈,确保了任何时候都能快速获取到当前栈中的最小元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:用O(1)的时间复杂度求最小元素。

在算法的设计当中,经常采用空间换时间的方式来提高时间复杂度,也就是用额外的存储空间来降低操作的时间复杂度。

解题思路:如果当前入栈的元素比原来栈中的元素最小值还要小,则把这个值压入保存最小值元素的栈中;在出栈的时候,如果当前的元素恰好等于当前栈中的那个最小值,保存最先值得栈顶元素也出栈,使当前最小值变为当前最小值入栈之前的那个最小值。

class Stack:
    def __init__(self):
        self.items = []

    def empty(self):
        """判断栈是否为空"""
        return len(self.items) == 0

    def size(self):
        """栈的大小"""
        return len(self.items)

    def peek(self):
        """返回栈顶元素"""
        if not self.empty():
            return self.items[len(self.items) - 1]
        else:
            return None

    def pop(self):
        """弹栈"""
        if len(self.items) > 0:
            return self.items.pop()
        else:
            print("栈空")

    def push(self, items):
        """压栈"""
        self.items.append(items)

class MyStack:
    def __init__(self):
        self.elemStack = Stack()  # 用来存储栈中元素
        self.minStack = Stack()  # 栈顶永远存储当前elemStack中最小的值

    def push(self, data):
        self.elemStack.push(data)
        # 更新保存最小元素的栈
        if self.minStack.empty():
            self.minStack.push(data)
        else:
            if data < self.minStack.peek():
                self.minStack.push(data)

    def pop(self):
        topData = self.elemStack.peek()
        self.elemStack.pop()
        if topData == self.mins():
            self.minStack.pop()
        return topData

    def mins(self):
        if self.minStack.empty():
            return 2 ** 32
        else:
            return self.minStack.peek()
if __name__ == "__main__":
    stack = MyStack()
    stack.push(7)
    print("栈中最小值为:" + str(stack.mins()))
    stack.push(5)
    print("栈中最小值为:" + str(stack.mins()))
    stack.push(6)
    print("栈中最小值为:" + str(stack.mins()))
    stack.push(2)
    print("栈中最小值为:" + str(stack.mins()))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值