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的最后一个元素

相关推荐
不去幼儿园几秒前
【启发式算法】Dijkstra算法详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法·图搜索算法
McQueen_LT7 分钟前
聊天室Python脚本——ChatGPT,好用
开发语言·python·chatgpt
zy_destiny17 分钟前
【YOLOv12改进trick】三重注意力TripletAttention引入YOLOv12中,实现遮挡目标检测涨点,含创新点Python代码,方便发论文
网络·人工智能·python·深度学习·yolo·计算机视觉·三重注意力
大数据追光猿19 分钟前
【大模型技术】LlamaFactory 的原理解析与应用
人工智能·python·机器学习·docker·语言模型·github·transformer
Start_Present32 分钟前
Pytorch 第七回:卷积神经网络——VGG模型
pytorch·python·神经网络·cnn·分类算法
朴拙数科32 分钟前
1:1精准还原!用Python+Adobe Acrobat DC实现PDF转Word全自动化
python·pdf·word
supermodule32 分钟前
基于flask的一个数据展示网页
后端·python·flask
范哥来了33 分钟前
python文本处理pdfminer库安装与使用
linux·开发语言·python
走在考研路上1 小时前
python官方文档阅读整理(一)
开发语言·python
sagima_sdu1 小时前
Python实现鼠标点击获取窗口进程信息
开发语言·python·计算机外设