返回

发现柱状图中最大的矩形:探索算法奥秘

后端

导语:

算法的世界里,LeetCode 是算法爱好者的圣地。其中,LeetCode 84:“柱状图中最大的矩形”更是算法领域中的经典挑战。它不仅考察了算法的基本功,也考验了对动态规划的理解。今天,让我们一起探索算法奥秘,征服柱状图中最大矩形的挑战!

算法解析:

  1. 问题定义:

    给定一个柱状图,每个柱子代表一个矩形的宽度,矩形的高度等于柱子的高度。求柱状图中面积最大的矩形。

  2. 动态规划:

    这个问题可以通过动态规划来解决。设 dp[i] 为从柱子 0 到柱子 i 的最大矩形面积。那么,对于每个柱子 i,我们有以下两种情况:

    • 如果柱子 i 的高度小于或等于柱子 i-1 的高度,那么 dp[i] 等于 dp[i-1]。
    • 如果柱子 i 的高度大于柱子 i-1 的高度,那么 dp[i] 等于当前柱子的面积加上 dp[i-1]。
  3. 算法步骤:

    1. 初始化 dp 数组,dp[0] 为柱子 0 的面积。
    2. 对于每个柱子 i,计算 dp[i]:
      • 如果柱子 i 的高度小于或等于柱子 i-1 的高度,那么 dp[i] 等于 dp[i-1]。
      • 如果柱子 i 的高度大于柱子 i-1 的高度,那么 dp[i] 等于当前柱子的面积加上 dp[i-1]。
    3. 返回 dp 数组的最大值。

代码示例:

def largest_rectangle_area(heights):
    """
    :type heights: List[int]
    :rtype: int
    """
    stack = []
    max_area = 0

    for i, height in enumerate(heights):
        while stack and height < heights[stack[-1]]:
            h = heights[stack.pop()]
            w = i if not stack else i - stack[-1] - 1
            max_area = max(max_area, h * w)
        stack.append(i)

    while stack:
        h = heights[stack.pop()]
        w = len(heights) if not stack else len(heights) - stack[-1] - 1
        max_area = max(max_area, h * w)

    return max_area

结语:

通过本文的解析,我们掌握了解决柱状图中最大矩形的算法奥秘。算法领域中,动态规划是一种常用的算法范式,掌握动态规划的精髓,将成为我们解决算法问题的利器。LeetCode 84 只是众多算法挑战中的一个,不断挑战自我,探索算法奥秘,方能成为算法高手。