📅  最后修改于: 2023-12-03 14:54:56.231000             🧑  作者: Mango
在堆栈数据结构中,常常会出现一种情况:需要找出栈中某个元素之后(包括该元素本身)的最大值或最小值。如何实现这个功能呢?
以下是一种简单而高效的解决方案:
我们可以使用两个堆栈:一个存储原始数据,另一个存储对应的最大值或最小值。
具体实现方式如下:
class MaxMinStack:
def __init__(self):
self.data_stack = []
self.min_max_stack = []
def push(self, val: int) -> None:
self.data_stack.append(val)
if not self.min_max_stack:
self.min_max_stack.append(val)
else:
self.min_max_stack.append(max(val, self.min_max_stack[-1]))
def pop(self) -> None:
self.data_stack.pop()
self.min_max_stack.pop()
def top(self) -> int:
return self.data_stack[-1]
def get_max(self) -> int:
return self.min_max_stack[-1]
def get_min(self) -> int:
return min(self.data_stack)
在上面的代码中,我们使用 data_stack
存储原始数据,而使用 min_max_stack
存储对应的最大值或最小值。
具体实现时,我们采用“延迟更新”的方式,即当插入一个新元素时,不仅将其压入 data_stack
中,而且判断其是否为当前栈中的最大值或最小值,然后将结果保存到 min_max_stack
中。这样,当需要获取最大值或最小值时,直接返回 min_max_stack
的顶部元素即可。
上面的算法实现中,插入、删除、获取最大值和获取最小值的时间复杂度均为 $O(1)$。因此,本算法的时间复杂度为 $O(n)$,其中 $n$ 是操作次数。
在空间复杂度方面, data_stack
和 min_max_stack
的空间复杂度均为 $O(n)$。因此,本算法的空间复杂度为 $O(n)$。
本文介绍了一种简单而高效的实现方式,可以在堆栈数据结构中找出某个元素之后(包括该元素本身)的最大值或最小值。此算法不仅时间复杂度低,而且空间复杂度也不会太高,因此非常适合在实际编程中使用。