LeetCode84. 柱状图中最大的矩形(python)

  • Post author:
  • Post category:python

解题思路: 单调栈 

先说单调栈,单调栈是一种特殊的栈,特殊的地方在于,每当有元素入栈时,只要栈顶元素大于要入栈的元素,栈顶元素就要弹出,直到栈顶元素小于等于当前元素,当前元素再入栈。所以说单调栈总是自底至顶单调的。

对于这道题来说,寻找最大面积的矩形,我们只要把每个元素作为高的最大矩形都求出来,再求最大即可。

遍历heights,大于栈顶元素则入栈。当栈顶元素大于当前元素,弹出栈顶,此时计算弹出栈顶元素为高的最大矩形面积,因为是单调栈,所以栈内的元素均小于当前元素,要进栈的元素又一定小于出栈元素。

所以,当栈不为空时:area = heights[x] * (i-stack[-1]-1);栈空时:area = heights[x] * i

代码:

class Solution(object):
    def largestRectangleArea(self, heights):
        """单调栈"""
        heights.append(0)
        stack = [0]
        area = 0
        for i in range(1, len(heights)):
            if heights[i] >= heights[stack[-1]]: #大于栈顶元素则入栈
                stack.append(i)
            else:
                while stack and heights[i] < heights[stack[-1]]: #只要栈非空且栈顶元素大于当前元素
                    x = stack.pop(-1) #弹出栈顶 此时计算以该元素为高的最大矩形
                    if len(stack) != 0:
                        area = max(area, heights[x] * (i-stack[-1]-1))
                    else:
                        area = max(area, heights[x] * i)
                stack.append(i)
        return area
                    
        

 


版权声明:本文为qq_43235359原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。