返回
柱状图最大面积计算之解题技巧与方法
前端
2023-09-09 11:59:47
题目分析
给定一个包含n个非负整数的数组height,其中每个数字代表柱状图中一个柱子的高度,请计算在柱状图中可以形成的最大矩形的面积。
例如,给定高度数组[2,1,5,6,2,3],如下图所示:
|
| +------------+
| | |
| | |
| | |
| +------------+
|
+------+---+---+---+----+---+
1 2 3 4 5 6
在这种情况下,最大的矩形面积为10平方单位,由柱子2、3、4和5构成。
解题思路
这道题目本质上是一个动态规划问题,我们可以使用栈和数组来解决。主要思路如下:
- 使用栈来存储柱子的索引。
- 遍历数组,对于每个柱子,如果其高度大于或等于栈顶柱子的高度,则将其索引入栈。
- 如果当前柱子的高度小于栈顶柱子的高度,则依次弹出栈顶柱子,并计算以该柱子为宽、栈顶柱子为高的矩形面积。
- 重复步骤2和步骤3,直到遍历完整个数组。
- 最后,计算栈中剩余柱子的矩形面积。
代码实现
def maximal_rectangle(heights):
"""
计算柱状图中最大矩形的面积。
参数:
heights: 一个包含n个非负整数的数组,其中每个数字代表柱状图中一个柱子的高度。
返回:
柱状图中最大矩形的面积。
"""
# 使用栈来存储柱子的索引。
stack = []
# 使用数组来存储每个柱子对应的最大矩形面积。
max_areas = [0] * len(heights)
for i, height in enumerate(heights):
# 如果栈为空或者当前柱子的高度大于或等于栈顶柱子的高度,则将其索引入栈。
while stack and heights[stack[-1]] >= height:
# 弹出栈顶柱子。
top = stack.pop()
# 计算以该柱子为宽、栈顶柱子为高的矩形面积。
if not stack:
max_areas[top] = height * i
else:
max_areas[top] = height * (i - stack[-1] - 1)
# 将当前柱子的索引入栈。
stack.append(i)
# 计算栈中剩余柱子的矩形面积。
while stack:
top = stack.pop()
if not stack:
max_areas[top] = heights[top] * len(heights)
else:
max_areas[top] = heights[top] * (len(heights) - stack[-1] - 1)
# 返回最大矩形面积。
return max(max_areas)
# 测试代码
heights = [2, 1, 5, 6, 2, 3]
print(maximal_rectangle(heights)) # 输出:10
时间复杂度分析
这道题目的时间复杂度为O(n),其中n是柱状图中柱子的数量。这是因为我们只需要遍历一次柱状图,并且每个柱子的操作都是常数时间复杂度。
总结
这道LeetCode算法题考察了动态规划和栈的数据结构的应用。通过使用栈和数组,我们可以高效地计算出柱状图中最大矩形的面积。这道题目的解决技巧对于解决其他类似的问题也非常有用。