本题解采用单调栈的方法来解决问题。首先,在数组的开始和结束位置分别添加一个高度为0的柱子,以便处理边界条件。维护一个单调递增的栈,栈中存储的是柱子的索引。遍历输入数组中的每个柱子,当当前柱子的高度大于栈顶元素对应的柱子高度时,直接将当前索引入栈。如果相等,替换栈顶元素。如果当前柱子的高度小于栈顶元素对应的柱子的高度,则持续将栈顶元素弹出,并计算以该栈顶元素为高度的矩形面积,直到栈顶元素的高度小于或等于当前柱子的高度。计算矩形的宽度为当前索引与新的栈顶元素的索引之间的差减一。每次计算完面积后,更新最大面积。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
# 在数组前后添加高度为0的柱子,处理边界条件
heights.insert(0, 0)
heights.append(0)
# 初始化栈,并将第一个元素(高度为0)的索引入栈
stack = [0]
ans = 0
# 遍历所有的柱子
for i in range(1, len(heights)):
# 当前柱子高度大于栈顶柱子高度,直接入栈
if heights[i] > heights[stack[-1]]:
stack.append(i)
# 当前柱子高度等于栈顶柱子高度,替换栈顶
elif heights[i] == heights[stack[-1]]:
stack.pop()
stack.append(i)
# 当前柱子高度小于栈顶柱子高度,计算可能的最大矩形面积
else:
while heights[stack[-1]] > heights[i]:
top_idx = stack.pop()
left = stack[-1]
width = i - left - 1
ans = max(ans, heights[top_idx] * width)
stack.append(i)
return ans