LeetCode Largest Rectangle in Histogram

本文介绍了一种使用栈解决LeetCode上“最大矩形”问题的有效方法。通过遍历柱状图并利用栈来记录柱子的高度,实现快速计算以每个柱子为高度的最大矩形面积。

LeetCode解题之Largest Rectangle in Histogram


原题

给定一个柱状图,求它能包含的最大的矩形的面积。如下图中阴影部分就是要求的矩形。

histogram_area

注意点:

  • 所有的柱的宽度都为1

例子:

输入: heights = [2,1,5,6,2,3]

输出: 10

解题思路

这道题卡了很久,一直没想到好的解决方案。查了一些资料,比较优雅的方法是通过栈来解决。

首先明确最终矩形的高度一定是某一个柱的高度,以上面的例子为例,可能是2,1,5,6,2,3中的一个,如果像这样把每个柱穷举出来,并尝试向两边扩展来得到最大面积,时间复杂度就太大。仔细想一想,为什么要尝试向两边扩展,如例子中的第二个2(以它为高的话最多可以涵盖4个柱),因为它的左右两边相邻的柱都有比它高的,也就是说柱的高度不是有序的,如果我们能得到一个有序递增的排列,那么就只要像右扩展,而不要向左扩展了,因为左边的柱比它自己低。

依次遍历柱状结构,如果是递增的则压栈,如果不是则把比它高的柱依次弹出(只弹出比当前柱高的可以保证把当前柱压栈后,栈中的柱依旧是依次递增的),并计算以该柱为高的矩形的面积。计算面积时,宽度应该是栈顶元素到遍历到元素之间的宽,如当弹出第二个2(2后面没有比它小的元素,为了使该元素能顺利弹出,在原柱状图末尾加一个0)时,栈顶元素是1,这样就能方便计算出宽度为4。还有一个问题是弹出1时栈中没有元素,无法计算宽度,所以在初始化时要在栈底加一个-1来应对所有元素都出栈的情况。

AC源码

class Solution(object):
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        heights.append(0)
        stack = [-1]
        result = 0
        for i in range(len(heights)):
            while heights[i] < heights[stack[-1]]:
                h = heights[stack.pop()]
                w = i - stack[-1] - 1
                result = max(result, h * w)
            stack.append(i)
        heights.pop()
        return result


if __name__ == "__main__":
    assert Solution().largestRectangleArea([2, 1, 5, 6, 2, 3]) == 10

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值