提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
又是周一啦!
一、题目
最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 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
pop、top 和 getMin 操作总是在 非空栈 上调用
push, pop, top, and getMin最多被调用 3 * 104 次
二、思路
首先我们应该了解栈的性质,由于栈先进后出,那么每个元素进栈时对应的站内元素最小值就是他为栈顶时的站内元素最小值(它下面的元素永远不会比他先离开或越过他加入)。因此,对于每个元素入栈时,同时维护一个当前最小元素值的记录,与元素一起入栈
时间复杂度O(1) 空间复杂度O(n)
三、代码
class MinStack:
def __init__(self):
self.stack=list() #栈
def push(self, val: int) -> None:
if(self.stack == []): #栈为空,最小值就是当前元素
minElement=val
else: #栈不空,最小值是 栈顶元素对应最小值 与 当前值 中小的那个\
minElement=min(val,self.stack[-1][1])
self.stack.append((val,minElement)) #入栈
def pop(self) -> None:
self.stack.pop() #出栈
def top(self) -> int:
return self.stack[-1][0] #返回值
def getMin(self) -> int:
return self.stack[-1][1] #获取最小值
\