155. 最小栈
https://leetcode-cn.com/problems/min-stack/
解法一:
主要就是维持一个指向最小元素的指针minIdx,这样getMin就能O(1),但是pop()的处理过程还是用了O(n)
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = [] #栈
self.minIdx = -1 #最小元素下标
def push(self, x: int) -> None:
self.stack.append(x)
if self.minIdx == -1:
self.minIdx = 0
elif x < self.stack[self.minIdx]: #更新最小下标
self.minIdx = len(self.stack) - 1
def pop(self) -> None:
if len(self.stack) == 1:
self.minIdx = -1
#若弹出元素是最小元素,则需更新最小下标
elif len(self.stack)-1 == self.minIdx:
self.minIdx = self.stack.index(min(self.stack[:-1]))
self.stack.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.stack[self.minIdx]
解法二:双栈
思路比较巧妙,一个stack存元素,一个idxStack存最小元素下标,两个栈长度相等,同步更新。
下标栈的栈顶idxStack[-1]存储当前stack的最小元素下标。
多用一个栈竟然内存消耗更少
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = [] #栈
self.idxStack = [] #最小元素下标栈
def push(self, x: int) -> None:
self.stack.append(x)
if len(self.stack) == 1:
self.idxStack.append(0)
else:
if x < self.stack[self.idxStack[-1]]:
self.idxStack.append(len(self.stack)-1)
else:
self.idxStack.append(self.idxStack[-1])
def pop(self) -> None:
self.stack.pop()
self.idxStack.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.stack[self.idxStack[-1]]
最后更新于