📅  最后修改于: 2023-12-03 14:56:27.768000             🧑  作者: Mango
给定一个表示直方图的数组,其中每个元素表示直方图中的高度。求取直方图中最大的矩形区域的面积。
例如,给定高度数组 [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)。