leetcode题解84.柱状图中最大的矩形(困难)单调栈思想

题目:
在这里插入图片描述
在这里插入图片描述

  1. 找出最大的矩形面积,首先要有一个较好的遍历方法。

  2. 本题找最大面积的遍历方法可以依据依据以下策略:找出以每个矩形为高的最大矩形面积。因此我们需要遍历每一个矩形高度,找出以当前矩形高度作为高的最大矩形面积。最后遍历所有的矩形高度,最大的面积即为所求。

  3. 依据上述思路,为了找到以当前柱子高度作为矩形高度的最大面积,我们需要寻找矩形的左右更边界来确定矩形的宽度,因此我们可以作出以下分析:

    右边界的查找:

    1. 右边界的柱形高度应该小于当前柱形高度

    左边界的查找:

    1. 左边界的柱形高度应该小于当前柱形高度

因此,在我们的计算过程中,有如下图示:
在这里插入图片描述

假设当前下标为3,下标为3的柱形高度6,求以6作为高度的最大矩形面积。左边界为下标left=2,右边界下标为right=4,因此面积就为6*(4-2-1)
暴力解法:
代码如下:

class Solution:
    def largestRectangleArea(self, heights):

    	maxarea = 0

    	for i in range(len(heights)):

    		left = i
    		cur_height = heights[i]

    		while left > 0 and heights[left - 1] >= cur_height:

    			left -= 1

    		right = i
    		
    		while right < len(heights) - 1 and heights[right + 1] >= cur_height:
    			right += 1

    		maxarea = max(maxarea, (right - left + 1) * cur_height)
    	return maxarea

经过上述分析,求解本题我们可以利用单调栈进行求解,单调栈具有以下性质:

栈顶的元素是栈内最大的元素,栈底的元素是栈内最小的元素。

我们应用单调栈求解本题,在栈内存储每个柱形高度对应的原始下标,如果栈顶部下标对应的柱形高度大于当前柱形的高度,我们就可以计算栈顶部下标对应的柱形高度所可以达到的最大矩形面积;因为栈顶下的下一个元素(下标)对应的高度也小于栈顶元素(下标)对应的高度;

代码如下:

class Solution:
    def largestRectangleArea(self, heights):

    	ans = 0
    	st = []

    	heights.insert(0,0)
    	heights.append(0)


    	for i in range(len(heights)):

    		while len(st) != 0 and heights[st[-1]] > heights[i]:

    			cur = st[-1]

    			st.pop()


    			left = st[-1] + 1
    			right = i - 1


    			ans = max(ans, (right - left + 1) *heights[cur])


    		st.append(i)
    	return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值