1 问题描述
自定义一个栈结构,,实现入栈、出栈、找出栈顶、使用常数时间找出栈中数据的最小值功能。
2 代码实现
这一题还是比较简单的,如果是在python
环境下,使用List
表示栈,那栈的写入与弹出只需要用到.append
与.pop
操作即可,而且时间复杂度均为1,但是,如果想要使用常数时间找到栈的最小值,那就需要用空间换时间,我们可以在栈写入与弹出时,存储对应时刻的最小值:
写入阶段:
非常好理解,我们只需要每次都比较写入的值与最小值的大小即可,最新写入的值小,那最小值就是它;
弹出阶段:
也很简单,如果弹出的值不是最小值,那最小值不变,如果弹出的值是最小值,该怎么办呢?
我们可以存储一个最小值队列,对写入阶段进行一个修改即可,具体方法是,如果写入阶段后进的值比其前一个写入的最小值相等或更小,那就将这个值视为是当前栈的最小值,随着栈的写入与弹出,动态维护这个队列,那队列中的最后一个元素始终是其对应当前栈的最小值。
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.ms = []
self.msize = 0
self.base = -1
self.top_idx = -1
self.min_ms = []
def push(self, val: int) -> None:
self.ms.append(val)
self.top_idx += 1
self.msize += 1
if (self.top_idx == 0) or (self.min_ms[-1] >= val):
self.min_ms.append(val)
def pop(self) -> None:
if self.msize > 0:
if self.min_ms[-1] == self.ms[self.top_idx]:
del self.min_ms[-1]
del self.ms[self.top_idx]
self.top_idx -= 1
self.msize -= 1
def top(self) -> int:
if self.top_idx >= 0:
return self.ms[self.top_idx]
else:
print('The stack has no element.')
def getMin(self) -> int:
if self.msize > 0:
return self.min_ms[-1]
# return min(self.ms)
else:
print('The stack has no element.')
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
这里额外存储了栈的顶部、底部以及栈的尺寸索引,方便后续有其他需求时进行改造。
时间复杂度均为 O ( 1 ) O(1) O(1),空间复杂度为 O ( n ) O(n) O(n).