📜  数据结构 |堆栈 |问题 8(1)

📅  最后修改于: 2023-12-03 14:54:56.231000             🧑  作者: Mango

数据结构 | 堆栈 | 问题 8

在堆栈数据结构中,常常会出现一种情况:需要找出栈中某个元素之后(包括该元素本身)的最大值或最小值。如何实现这个功能呢?

以下是一种简单而高效的解决方案:

算法实现

我们可以使用两个堆栈:一个存储原始数据,另一个存储对应的最大值或最小值。

具体实现方式如下:

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_stackmin_max_stack 的空间复杂度均为 $O(n)$。因此,本算法的空间复杂度为 $O(n)$。

总结

本文介绍了一种简单而高效的实现方式,可以在堆栈数据结构中找出某个元素之后(包括该元素本身)的最大值或最小值。此算法不仅时间复杂度低,而且空间复杂度也不会太高,因此非常适合在实际编程中使用。