📅  最后修改于: 2023-12-03 15:27:16.513000             🧑  作者: Mango
本文将介绍如何在直方图中找到最大矩形区域。这个问题可以使用单调栈来解决,时间复杂度为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)的时间复杂度。如果您还有其他问题或观点,请在下方留言区讨论。