代码随想录 单调栈part3

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

思路:

双指针(dp):想得到最大的矩形,遍历所有元素,以该元素为高,往左右尽可能取最长的宽。取所有的这样的矩形的面积最大值。

class Solution:
    def largestRectangleArea(self, heights):
        left_dp = [0 for _ in range(len(heights))]

        right_dp = [0 for _ in range(len(heights))]
        left_dp[0] = -1
        right_dp[-1] = len(right_dp)

        ans = 0

        for i in range(1, len(heights)):  # 求每一列左边第一根低于当前高度的柱子
            temp = i - 1
            while temp > -1 and heights[temp] >= heights[i]:
                temp = left_dp[temp]  # 转移到左边第一根低于temp柱子高度的柱子比temp低的(dp)
            left_dp[i] = temp

        for j in range(len(heights) - 2, -1, -1):  # 求每一列右边最高的柱子
            temp = j + 1
            while temp < len(heights) and heights[temp] >= heights[j]:
                temp = right_dp[temp]
            right_dp[j] = temp

        for k in range(len(heights)):
            area = heights[k] * (right_dp[k] - left_dp[k] - 1)
            ans = max(area, ans)
        print(left_dp, right_dp)
        return ans

单调栈:取雨水时找凹陷,这次相当于找凸起,找所有的凸起中面积最大的凸起

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        heights.insert(0, 0)
        heights.append(0)
        stack = [0]
        result = 0
        for i in range(1, len(heights)):
            while stack and heights[i] < heights[stack[-1]]:
                mid_height = heights[stack[-1]]
                stack.pop()
                if stack:  # 更新最大值作为result
                    area = (i - stack[-1] - 1) * mid_height
                    result = max(area, result)
            stack.append(i)
        return result

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值