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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_20141867/article/details/81938671

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

猜你喜欢

转载自blog.csdn.net/qq_20141867/article/details/81938671