返回

柱状图中最大的矩形

前端

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

总结

这道题的解法比较巧妙,我们可以利用栈来维护当前已经确定的柱子,然后依次遍历柱子,如果当前柱子比栈顶元素大,那么就把当前柱子压入栈中。如果当前柱子比栈顶元素小,那么就将栈顶元素弹出,并计算以这个柱子为底边、左右柱子为高边的矩形面积,最后取其中最大的一个。

这道题的解题技巧和注意事项如下:

  • 使用栈来维护当前已经确定的柱子。
  • 当遇到比栈顶元素小的柱子时,将栈顶元素弹出,并计算以这个柱子为底边、左右柱子为高边的矩形面积。
  • 当遍历完所有柱子后,将栈中剩余的柱子依次弹出,并计算以这些柱子为底边、左右柱子为高边的矩形面积。
  • 取所有矩形面积中的最大值作为最终结果。