返回

以纵向思维发现矩形面积新维度

人工智能

单调栈在「最大矩形问题」中的应用

「最大矩形问题」是LeetCode中一个著名的Hard难度题目,它要求我们在给定的柱状图中找到面积最大的矩形。这道题乍一看上去很复杂,但我们可以通过单调栈这种数据结构来轻松解决它。

什么是单调栈?

单调栈是一种特殊的栈,它具有以下特点:

  • 栈中元素是单调递增或单调递减的。
  • 栈顶元素始终是栈中最大的元素(递增栈)或最小的元素(递减栈)。

单调栈的优势

单调栈的优势在于,它可以帮助我们快速找到栈中某个元素的前一个更大的元素或后一个更小的元素。这对于解决「最大矩形问题」非常有用。

单调栈如何解决「最大矩形问题」?

我们首先将柱状图中的每个柱子看作是一个矩形,然后将这些矩形按照从左到右的顺序入栈。当我们遇到一个柱子时,我们会先检查栈顶元素是否比当前柱子高。如果是,则说明当前柱子不能形成更大的矩形,我们将栈顶元素出栈。然后,我们将当前柱子入栈。

如果我们遇到一个柱子,它的高度大于等于栈顶元素的高度,则说明我们可以使用这个柱子来形成更大的矩形。我们将当前柱子入栈,并记录下当前柱子的高度和位置。

当我们遍历完所有的柱子后,我们将栈中剩余的元素依次出栈。对于每个出栈的元素,我们计算它与栈顶元素之间的面积。最大面积即为所求。

单调栈解决「最大矩形问题」的代码

def largest_rectangle_area(heights):
    stack = []
    max_area = 0

    for i, height in enumerate(heights):
        while stack and heights[stack[-1]] >= height:
            h = heights[stack.pop()]
            w = i if not stack else i - stack[-1] - 1
            max_area = max(max_area, h * w)
        stack.append(i)

    while stack:
        h = heights[stack.pop()]
        w = len(heights) if not stack else len(heights) - stack[-1] - 1
        max_area = max(max_area, h * w)

    return max_area


heights = [2, 1, 5, 6, 2, 3]
print(largest_rectangle_area(heights))  # 10

结语

单调栈是一种非常有用的数据结构,它可以帮助我们解决许多困难的问题。对于「最大矩形问题」来说,单调栈的优势非常明显。它可以帮助我们快速找到栈中某个元素的前一个更大的元素或后一个更小的元素,这对于解决这个问题非常有用。