155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 1:

复制代码
输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

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

提示:

  • -231 <= val <= 231 - 1
  • poptopgetMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 104

1. 分析

题目要求实现 MinStack 类,且在常数时间内检索到最小元素的栈。关键是如何实现常数时间内检索,如果用普通的min()函数对于栈内所有元素排序的话时间复杂度是nlongn(内置快排实现)。我们可以尝试往栈里面存一个列表,列表里面存元组,然后依次更新最小值和入栈元素,本质还是用到了空间换时间的方法。

2. 实现思路

栈用python实现就较易,先把栈stack=[]定义成一个列表List,在python中,stack.pop()就是移除列表的最后一个元素,类似出栈操作。有元素入栈的时候我们往列表里面存一个元组(x,最小值),每次存的时候就会更新这个最小值,但是原来的值也也还是,相当于数组是不断的增加元素,就算删除一个元素之前的最小值依然存在。如图

我们先push(4),由于是空栈添加元素,需要特殊处理,stack.append((x,x),因为空栈时入栈,入栈元素即为最小值,若非空栈是元素入栈,则往列表里面添加(当前值和,与上一个最小值的最小值),这样可以防止在pop()后之前得到到元素依然是最小值。

3. 代码如下

复制代码
class MinStack(object):

    def __init__(self):
        self.stack=[]
    def push(self, x):
        if not self.stack:
            self.stack.append((x,x))#第一个x存栈的元素,第二个存此时的最小值
        else:
            self.stack.append((x,min(x,self.stack[-1][1])))

    def pop(self):
        self.stack.pop()
    def top(self):
        return self.stack[-1][0]
    def getMin(self):
        return self.stack[-1][1]

obj = MinStack()
obj.push(4)
print(obj.stack)
obj.push(3)
print(obj.stack)
obj.push(5)
print(obj.stack)
obj.push(1)
print(obj.stack)
obj.pop()
print(obj.stack)
obj.pop()
print(obj.stack)
print(obj.getMin())
# param_3 = obj.top()
# param_4 = obj.getMin()

stack[-1]是取出stack的最后一个元素

相关推荐
带娃的IT创业者15 分钟前
如何开发一个教育性质的多线程密码猜测演示器
网络·python·算法
luckys.one6 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
大翻哥哥7 小时前
Python 2025:量化金融与智能交易的新纪元
开发语言·python·金融
zhousenshan9 小时前
Python爬虫常用框架
开发语言·爬虫·python
IMER SIMPLE9 小时前
人工智能-python-深度学习-经典神经网络AlexNet
人工智能·python·深度学习
CodeCraft Studio9 小时前
国产化Word处理组件Spire.DOC教程:使用 Python 将 Markdown 转换为 HTML 的详细教程
python·html·word·markdown·国产化·spire.doc·文档格式转换
专注API从业者10 小时前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
java1234_小锋10 小时前
[免费]基于Python的协同过滤电影推荐系统(Django+Vue+sqlite+爬虫)【论文+源码+SQL脚本】
python·django·电影推荐系统·协同过滤
看海天一色听风起雨落11 小时前
Python学习之装饰器
开发语言·python·学习
XiaoMu_00111 小时前
基于Python+Streamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现
python·信息可视化·旅游