📜  直方图中的最大矩形区域 |设置 2(1)

📅  最后修改于: 2023-12-03 15:27:16.513000             🧑  作者: Mango

直方图中的最大矩形区域 | 设置 2

本文将介绍如何在直方图中找到最大矩形区域。这个问题可以使用单调栈来解决,时间复杂度为O(n)。

问题描述

给定一个直方图,每个柱形的宽度均为1,找到最大矩形的面积。

例如,给定直方图:[2,1,5,6,2,3],最大矩形区域为10。

解决方案
算法思路
  • 对于每个柱形,计算它向左和向右能扩展的最大宽度。
  • 对于每个柱形,计算以它为高度的最大矩形面积。
  • 取所有矩形面积的最大值即为所求。

这个算法的时间复杂度是O(n^2),无法通过本题。我们需要使用单调栈来优化。

单调栈

单调栈是一个栈,满足从栈底到栈顶的元素是单调递增或单调递减的。单调栈可以找到每个元素左右第一个比它小(或大)的元素。

算法实现

对于每个柱形,我们需要找到其左右第一个比它小的元素,这可以用单调栈来实现。

我们使用一个递增栈,存储柱形的下标。添加新的柱形时,如果它比栈顶的柱形高,直接入栈;否则,不断弹出栈顶,直到栈为空或栈顶元素比新柱形小,然后将新柱形入栈。

这样,我们就能找到每个柱形的左右两侧第一个比它小的柱形,从而计算以该柱形为高的最大矩形面积。

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        n = len(heights)
        left, right = [0] * n, [n] * n
        stack = []
        for i in range(n):
            while stack and heights[stack[-1]] >= heights[i]:
                right[stack[-1]] = i
                stack.pop()
            left[i] = stack[-1] if stack else -1
            stack.append(i)
        return max((right[i]-left[i]-1)*heights[i] for i in range(n))
总结

本文介绍了如何在直方图中找到最大矩形区域。通过使用单调栈优化,我们可以达到O(n)的时间复杂度。如果您还有其他问题或观点,请在下方留言区讨论。