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

相关推荐
影惜寒4 分钟前
python作业一
python
jzwalliser8 分钟前
洛谷 P1035 [NOIP2002 普及组] 级数求和
c++·python·算法
Strengthen_沈10 分钟前
简单分享下python的Fuk库
开发语言·python
只是有点小怂19 分钟前
【chatgpt】 PyTorch中dtype属性,表示张量的数据类型
pytorch·python·chatgpt
python资深爱好者1 小时前
Python中列表推导式的概念以及示例
开发语言·python
想胖的壮壮1 小时前
python中的原子操作简介
开发语言·python
baozongwi1 小时前
ctfshow sqli-libs web561--web568
数据库·经验分享·python·sql·mysql·web安全
码农超哥同学2 小时前
Python面试题:如何在 Python 中反转一个字符串?
开发语言·windows·python·面试·编程
Wen.py.java2 小时前
Python商务数据分析知识专栏(六)——Python数据分析的应用④Python数据分析实训
人工智能·python·数据分析
不死鸟.亚历山大.狼崽子2 小时前
python库(2):Passlib库
开发语言·python