📜  在 O(1) 中找到堆栈中的最大值而不使用额外的堆栈(1)

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

在 O(1) 中找到堆栈中的最大值而不使用额外的堆栈
问题描述

给定一个堆栈,需要在 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),因为我们没有遍历任何表。