LeetCode 84 [Largest Rectangle in Histogram]

原题

给出的n个非负整数表示每个直方图的高度,每个直方图的宽均为1,在直方图中找到最大的矩形面积。

给出 height = [2,1,5,6,2,3],返回 10 (5 * 2)

解题思路

  • DP一般是把n!/nn/2n优化到n2/n3,而本题暴力解法是n^2,我们希望优化到n,不是DP的强项
  • n^2 -> n (stack强项)
  • 求出把每个柱子当做最小的得到的面积 -> 求出n个值,取min
  • 通过维护一个升序stack,实现 -> 找到每个数左边第一个比它小的和右边第一个比它小的
# push 2
stack = [] -> [2]
# push 1 ,以为2 > 1,所以pop 2以维持升序stack
# 2左边第一个比它小的就是none,右边第一个比它小的就是1
stack = [2] -> [1]
  • Conditional Operator in Python
# Java version
a > 10 ? b : c
# Python version
b if a > 10 else c

完整代码

class Solution(object):
    def largestRectangleArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        if not height:
            return 0
            
        res = 0
        stack = []
        height.append(-1)
        for i in range(len(height)):
            current = height[i]
            while len(stack) != 0 and current <= height[stack[-1]]:
                h = height[stack.pop()]
                w = i if len(stack) == 0 else i - stack[-1] - 1
                res = max(res, h * w)
            stack.append(i)
        return res

推荐阅读更多精彩内容