返回
发现柱状图中最大的矩形:探索算法奥秘
后端
2023-09-14 03:35:35
导语:
算法的世界里,LeetCode 是算法爱好者的圣地。其中,LeetCode 84:“柱状图中最大的矩形”更是算法领域中的经典挑战。它不仅考察了算法的基本功,也考验了对动态规划的理解。今天,让我们一起探索算法奥秘,征服柱状图中最大矩形的挑战!
算法解析:
-
问题定义:
给定一个柱状图,每个柱子代表一个矩形的宽度,矩形的高度等于柱子的高度。求柱状图中面积最大的矩形。
-
动态规划:
这个问题可以通过动态规划来解决。设 dp[i] 为从柱子 0 到柱子 i 的最大矩形面积。那么,对于每个柱子 i,我们有以下两种情况:
- 如果柱子 i 的高度小于或等于柱子 i-1 的高度,那么 dp[i] 等于 dp[i-1]。
- 如果柱子 i 的高度大于柱子 i-1 的高度,那么 dp[i] 等于当前柱子的面积加上 dp[i-1]。
-
算法步骤:
- 初始化 dp 数组,dp[0] 为柱子 0 的面积。
- 对于每个柱子 i,计算 dp[i]:
- 如果柱子 i 的高度小于或等于柱子 i-1 的高度,那么 dp[i] 等于 dp[i-1]。
- 如果柱子 i 的高度大于柱子 i-1 的高度,那么 dp[i] 等于当前柱子的面积加上 dp[i-1]。
- 返回 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 只是众多算法挑战中的一个,不断挑战自我,探索算法奥秘,方能成为算法高手。