返回
柱状图中最大的矩形
前端
2023-10-31 20:48:30
LeetCode刷题之路 第十四期: 柱状图中最大的矩形
你好!欢迎来到 LeetCode 刷题之旅的第十四期,今天我们一起来解决 柱状图中最大的矩形 这道题。
题目
给定一个柱状图,其中每个柱子的宽度为 1,求最大的矩形面积。
解题思路
这道题有两种解法,一种是暴力解法,一种是动态规划。暴力解法比较简单,我们可以枚举每一个柱子,并计算以这个柱子为底边、左右柱子为高边的矩形面积,最后取其中最大的一个。但是这种方法的时间复杂度为 O(n^2),其中 n 是柱子的数量。动态规划的解法比较复杂,但是时间复杂度为 O(n),我们可以使用一个栈来维护当前已经确定的柱子,然后依次遍历柱子,如果当前柱子比栈顶元素大,那么就把当前柱子压入栈中。如果当前柱子比栈顶元素小,那么就将栈顶元素弹出,并计算以这个柱子为底边、左右柱子为高边的矩形面积,最后取其中最大的一个。
代码实现
def largestRectangleArea(heights):
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
总结
这道题的解法比较巧妙,我们可以利用栈来维护当前已经确定的柱子,然后依次遍历柱子,如果当前柱子比栈顶元素大,那么就把当前柱子压入栈中。如果当前柱子比栈顶元素小,那么就将栈顶元素弹出,并计算以这个柱子为底边、左右柱子为高边的矩形面积,最后取其中最大的一个。
这道题的解题技巧和注意事项如下:
- 使用栈来维护当前已经确定的柱子。
- 当遇到比栈顶元素小的柱子时,将栈顶元素弹出,并计算以这个柱子为底边、左右柱子为高边的矩形面积。
- 当遍历完所有柱子后,将栈中剩余的柱子依次弹出,并计算以这些柱子为底边、左右柱子为高边的矩形面积。
- 取所有矩形面积中的最大值作为最终结果。