蓝桥杯备战——最小栈 Python打卡

简介: 蓝桥杯备战——最小栈 Python打卡

题目描述:


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


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

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

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

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


分析:题目要求常数时间内完成,那么排序的操作就不可以放在getmin当中,最直接的就是引入另外一个空间 ,当然效率也比较低:

class MinStack:
    def __init__(self):
        self.stack=[]
        self.tmp=[]#临时空间
    def push(self, val: int) -> None:
        self.stack.append(val)
        self.tmp.append(val)
        for i in range(len(self.tmp)-1):
            if self.tmp[i]<self.tmp[i+1]:
                self.tmp[i],self.tmp[i+1]=self.tmp[i+1],self.tmp[i]
    def pop(self) -> None:
        del self.tmp[self.tmp.index(self.stack[-1])]
        del self.stack[-1]#前后顺序不能调换,否则就会以更新后的self.stack[-1]删除,造成错误!!
    def top(self) -> int:
        return self.stack[-1]
    def getMin(self) -> int:
        return self.tmp[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

0.0看了官方题解,可以仅使用一个空间满足,时间上快了很多!!

8ac03bd4937a416db0a96f00de6ab1c2.png

下面是优化后的代码:

class MinStack:
    def __init__(self):
        self.stack=[]#尝试仅使用一个空间 每个元素是元组 储存当前压栈对象和栈最小值
    def push(self, val: int) -> None:
        if not self.stack:
            self.stack.append((val,val))
        else:
            self.stack.append((val,min(self.stack[-1][1],val)))
    def pop(self) -> None:
        del self.stack[-1]
    def top(self) -> int:
        return self.stack[-1][0]
    def getMin(self) -> int:
        return self.stack[-1][1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

其实也挺容易理解,就是把最关键的两个变量,min元素和压栈元素存储起来,压栈元素与上一轮压栈后栈的最小值比较,形成结果。就是一个前后联系的过程 满足了栈先进后出 后进先出的特点,比如bcd在a底下,a作为栈顶,g是待压栈元素,只需g和abcd比较


I am 小郑 和我一起准备蓝桥杯吧 寒假卷起来 进大厂!


相关文章
|
2月前
|
Python
蓝桥杯练习题(一):Python组之入门训练题
这篇文章是关于蓝桥杯Python组的入门训练题,包括Fibonacci数列、圆的面积、序列求和和A+B问题的具体代码实现和样例输出。
139 0
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
109 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
2月前
|
存储 缓存 Java
深度解密 Python 虚拟机的执行环境:栈帧对象
深度解密 Python 虚拟机的执行环境:栈帧对象
70 13
|
2月前
|
人工智能 Python
蓝桥杯练习题(四):Python组之历届试题三十题
关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。
42 0
蓝桥杯练习题(四):Python组之历届试题三十题
|
2月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(二):Python组之基础练习三十题
蓝桥杯Python编程练习题的集合,包含了三十个不同难度的编程题目,覆盖了基础语法、数据结构和算法等领域。
43 0
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
31 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 09. 用两个栈实现队列
使用两个栈实现队列的Python解决方案,包括初始化两个栈、实现在队列尾部添加整数的appendTail方法和在队列头部删除整数的deleteHead方法,以及相应的示例操作。
41 2
|
4月前
|
Python
【Leetcode刷题Python】232. 用栈实现队列
如何使用Python语言通过两个栈来实现队列的所有基本操作,包括入队(push)、出队(pop)、查看队首元素(peek)和判断队列是否为空(empty),并提供了相应的代码实现。
22 0
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
110 0
|
7月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
86 0