📅  最后修改于: 2023-12-03 14:51:03.279000             🧑  作者: Mango
给定一个堆栈,需要在 O(1) 的时间复杂度内找到堆栈中的最大值。
如果使用单个堆栈,我们可以从中找到堆栈中的最大值,并且我们不需要使用任何其他外部数据结构(如另一个堆栈或列表)。
我们将在堆栈中保留一些额外的信息,同时维护我们的基本堆栈结构。
我们将维护一个另一个堆栈,称为 max_stack。
当我们在普通堆栈中添加新元素时,我们将比较该元素与 max_stack 的顶部元素。如果新元素大于或等于 max_stack 的顶部元素,则我们将该元素推入 max_stack 中。否则,我们将重复推入 max_stack 的顶部元素。
如果我们弹出 normal_stack 中的元素,则我们会检查该元素是否等于 max_stack 的顶部元素。如果是,则我们可以弹出 max_stack 的元素。
与常规堆栈相比,我们需要存储的数据较小,因为我们仅存储最大值。
下面是 Python 代码:
class MaxStack:
def __init__(self):
self.normal_stack = []
self.max_stack = []
def push(self, x: int) -> None:
self.normal_stack.append(x)
if not self.max_stack or x >= self.max_stack[-1]:
self.max_stack.append(x)
def pop(self) -> None:
if self.normal_stack[-1] == self.max_stack[-1]:
self.max_stack.pop()
self.normal_stack.pop()
def top(self) -> int:
return self.normal_stack[-1]
def getMax(self) -> int:
return self.max_stack[-1]
因为我们使用了另一个堆栈来维护最大值,所以在空间上稍微糟糕一些。时间复杂度为 O(1),因为我们没有遍历任何表。