返回

史上最全教程:单调栈巧解LeetCode 84. 柱状图中最大的矩形

后端

单调栈算法解析:破解LeetCode 84. 柱状图中最大的矩形

简介

柱状图中最大的矩形 是 LeetCode 上备受推崇的一道算法挑战题。想象一下你面前有一排柱状图,每个柱子代表一个非负整数。你的任务是找到柱状图中最大的矩形面积,这个矩形必须由相邻的柱子组成,高度可以是任意整数。

单调栈算法

解决这道难题,我们将引入一种名为单调栈 的强力数据结构。单调栈是一种特殊的栈,具有单调递增或单调递减的性质。它们在解决算法问题中发挥着重要作用,包括求解柱状图中最大的矩形面积。

单调栈的应用

第一步:准备工作

首先,我们将柱状图中的每个柱子编号为 0 到 n-1。我们还需要一个辅助数组 height 来存储柱状图的高度。

第二步:单调递增栈

接下来,我们使用单调递增栈处理柱状图。我们将柱状图中的每个柱子依次入栈。当我们遇到一个柱子高度小于等于栈顶柱子高度时,说明我们找到了一个可能的矩形。此时,我们将栈顶柱子出栈,并计算出由该柱子和它之前入栈的柱子组成的矩形面积。

第三步:单调递减栈

当我们遇到一个柱子高度大于栈顶柱子高度时,说明我们需要一个新的单调递增栈。此时,我们将栈清空,并将当前柱子入栈。

第四步:计算矩形面积

当我们处理完所有柱子后,栈中可能还有一些柱子。对于这些柱子,我们也需要计算出由它们组成的矩形面积。

第五步:找出最大面积

最后,我们将计算出的所有矩形面积进行比较,找出最大的矩形面积。

代码实现(Python)

def largest_rectangle_area(heights):
    """
    计算柱状图中最大的矩形面积。

    参数:
        heights: 柱状图的高度数组。

    返回:
        最大的矩形面积。
    """

    n = len(heights)
    stack = []
    max_area = 0

    for i in range(n):
        while stack and heights[stack[-1]] > heights[i]:
            top = stack.pop()
            if not stack:
                area = heights[top] * i
            else:
                area = heights[top] * (i - stack[-1] - 1)
            max_area = max(max_area, area)

        stack.append(i)

    while stack:
        top = stack.pop()
        if not stack:
            area = heights[top] * n
        else:
            area = heights[top] * (n - stack[-1] - 1)
        max_area = max(max_area, area)

    return max_area

总结

单调栈是一种非常有用的数据结构,它可以帮助我们解决许多困难的算法问题。在本文中,我们介绍了如何使用单调栈来解决 LeetCode 上的 柱状图中最大的矩形 挑战题。通过深入浅出的讲解,你已经掌握了单调栈的强大威力,并能轻松应对这类难题。现在,是时候在 LeetCode 上大展身手了!

常见问题解答

  1. 单调栈的本质是什么?
    单调栈是一种具有单调递增或单调递减性质的特殊栈。它保证了栈顶元素始终是单调递增或单调递减的。

  2. 为什么单调栈在求解柱状图中最大的矩形中如此有用?
    单调栈可以帮助我们找出相邻柱子构成的矩形的最大高度。当我们遇到一个柱子高度较低时,它可以让我们立即计算出它与之前较高柱子构成的矩形面积。

  3. 在单调栈算法中,如何处理栈中剩下的柱子?
    当我们处理完所有柱子后,栈中可能还有一些柱子。对于这些柱子,我们也需要计算出由它们组成的矩形面积。

  4. 单调栈算法的时间复杂度是多少?
    单调栈算法的时间复杂度为 O(n),其中 n 是柱状图中的柱子数量。

  5. 除了求解柱状图中最大的矩形外,单调栈算法还有什么应用?
    单调栈算法还可以应用于求解以下问题:

    • 寻找下一个更大元素
    • 寻找下一个较小元素
    • 求解最大子数组和
    • 求解逆波兰表达式