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

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

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

问题描述

给定一个表示直方图的数组,其中每个元素表示直方图中的高度。求取直方图中最大的矩形区域的面积。

例如,给定高度数组 [2,1,5,6,2,3] ,最大的矩形区域为宽度为 2,高度为 5 的矩形,其面积为 10。

解决方案
暴力搜索

可以遍历所有可能的矩形,求出它们的面积,最终返回最大值。该算法的时间复杂度为O(n^2)。

def largestRectangleArea(heights) -> int:
    """
    暴力搜索
    """
    n = len(heights)
    max_area = 0
    for i in range(n):
        min_height = float('inf')
        for j in range(i, n):
            min_height = min(min_height, heights[j])
            max_area = max(max_area, min_height * (j - i + 1))
    return max_area
利用单调栈

暴力搜索的时间复杂度太高,我们需要一个更加高效的算法。可以利用单调栈来实现。

单调栈是指一个栈,其中的元素在插入的过程中会保持一定的单调性。这里我们使用一个递增栈,也就是栈底到栈顶的元素是递增的。

遍历直方图,如果当前高度小于等于栈顶元素的高度,那么就将栈顶元素弹出,并且计算以这个栈顶元素为高度的最大矩形面积。以这个栈顶元素的下一个元素为左边界,当前元素的前一个元素为右边界。

遍历完成后,如果栈不为空,那么对于栈中的每个元素,计算以它为高度的最大矩形面积。以这个元素的下一个元素为左边界,直方图的长度为右边界。

这个算法的时间复杂度为O(n),因为每个元素最多只会进出栈一次。

def largestRectangleArea(heights) -> int:
    """
    利用单调栈
    """
    n = len(heights)
    stack = []
    max_area = 0
    for i in range(n):
        while stack and heights[i] <= heights[stack[-1]]:
            height = heights[stack.pop()]
            width = i if not stack else i - stack[-1] - 1
            max_area = max(max_area, height * width)
        stack.append(i)
    while stack:
        height = heights[stack.pop()]
        width = n if not stack else n - stack[-1] - 1
        max_area = max(max_area, height * width)
    return max_area
总结

这道题目可以使用暴力搜索和单调栈两种方法进行求解。单调栈的方法效率更高,时间复杂度为O(n)。