返回

柱状图最大面积计算之解题技巧与方法

前端

题目分析

给定一个包含n个非负整数的数组height,其中每个数字代表柱状图中一个柱子的高度,请计算在柱状图中可以形成的最大矩形的面积。

例如,给定高度数组[2,1,5,6,2,3],如下图所示:

        |
        |        +------------+
        |        |            |
        |        |            |
        |        |            |
        |        +------------+
        |
        +------+---+---+---+----+---+
              1   2   3   4   5   6

在这种情况下,最大的矩形面积为10平方单位,由柱子2、3、4和5构成。

解题思路

这道题目本质上是一个动态规划问题,我们可以使用栈和数组来解决。主要思路如下:

  1. 使用栈来存储柱子的索引。
  2. 遍历数组,对于每个柱子,如果其高度大于或等于栈顶柱子的高度,则将其索引入栈。
  3. 如果当前柱子的高度小于栈顶柱子的高度,则依次弹出栈顶柱子,并计算以该柱子为宽、栈顶柱子为高的矩形面积。
  4. 重复步骤2和步骤3,直到遍历完整个数组。
  5. 最后,计算栈中剩余柱子的矩形面积。

代码实现

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算法题考察了动态规划和栈的数据结构的应用。通过使用栈和数组,我们可以高效地计算出柱状图中最大矩形的面积。这道题目的解决技巧对于解决其他类似的问题也非常有用。