【LeetCode】【84. Largest Rectangle in Histogram】(python版)

12 篇文章 1 订阅
2 篇文章 0 订阅

Description:

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.


Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

 


The largest rectangle is shown in the shaded area, which has area = 10 unit.

 

Example:

Input: [2,1,5,6,2,3]
Output: 10

思路:

题目要求:求直方图中可构成的最大矩形面积。

方法一:暴力求解,转化为纯数学问题,求区间内最小值×区间长度,其结果中最大值。以每个数作为区间起始往后延伸,边计算区间长度(矩形长)边维护区间最小值(矩形高)。时间复杂度为O(n^2)。或者以每个数作为区间最小值(矩形高)往两边延伸,一直延伸遇到更小值停下,计算这个最大区间的长度即为矩形的长。时间复杂度也是O(n^2)

方法二:使用堆栈。暴力求解的后一种方法的基本思想无非是找到可以以某一个矩形条高度作为矩形高的最大左右边界。因此维护一个单调非减栈,如果当前矩形条高于栈顶矩形条,那么入栈;否则,也就意味着找到了以栈顶矩形条为矩形高的右边界,同时如果栈不为空,那么栈顶矩形条的下一个矩形一定是比它要矮,也就是左边界,如果栈为空,说明栈顶矩形条比它左边所有矩形条都高,左边界也就是第一个矩形条。

为了方便计算矩形的长度,在栈中保存矩形t条的索引下标。具体算法实现如下:

 

def largestRectangleArea(heights):
    n = len(heights)
    if n == 0:
        return 0
    # 先将第一个矩形条下标压入栈
    index_stack = [0]
    max_area = 0
    curindex = 1
    # 矩形条遍历结束但是栈不为空时仍要继续
    while curindex < n or (curindex == n and len(index_stack) > 0):
        # 当栈为空或者当前矩形条高于栈顶矩阵条,下标入栈
        if curindex < n and (len(index_stack) == 0 or heights[curindex] >= heights[index_stack[-1]]):
            index_stack.append(curindex)
            curindex += 1
        # 当矩形条遍历结束或者当前矩阵条高度低于栈顶矩阵条时
        else:
            # 矩形的高度为栈顶矩形条高度,栈顶矩形条出站
            height = heights[index_stack.pop()]
            # 如果此时栈为空了,表示已出站的矩形条比其左边所有矩形条都矮,左边界下标也就是0,否则左边界下标为(下一个元素的索引+1)
            curmax = height * (curindex - index_stack[-1] - 1) if len(index_stack) > 0 else height * curindex
            max_area = max(max_area, curmax)
    return max_area

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值