LeetCode 84. 柱状图中最大的矩形(Hard)/ 1105. 填充书架(M)

在这里插入图片描述
题目链接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution:
    ### 0122 单调栈(248 ms,25.4 MB)
    def largestRectangleArea(self, heights: List[int]) -> int:
        res = 0

        # 放置左右两个哨兵
        heights = [0] + heights + [0]

        # 单调栈预先存放一个0,防止空栈情况
        stack = [0]

        for i in range(1, len(heights)):
            # 若前面的柱子比当前柱子高,则前面的柱子依次出栈,每次更新最大面积
            while heights[stack[-1]] > heights[i]:
                cur_h = heights[stack.pop()] # 注意:这里已经通过pop出栈
                cur_w = i - stack[-1] - 1
                res = max(res, cur_h * cur_w)
            
            # 当前柱子入栈
            stack.append(i)

        return res

1105. 填充书架

在这里插入图片描述

class Solution:
    def minHeightShelves(self, books: List[List[int]], shelfWidth: int) -> int:
        n = len(books)
        dp = [inf] * (n + 1)    # dp[i] 表示放下前 i 本书所用的最小高度
        dp[0] = 0               # 没有书时,高度为 0 

        for i, b in enumerate(books):
            curWidth = 0
            maxHeight = 0

            j = i
            while j >= 0:
                curWidth += books[j][0]
                if curWidth > shelfWidth:
                    break
                    
                maxHeight = max(maxHeight, books[j][1])
                dp[i + 1] = min(dp[i + 1], dp[j] + maxHeight)
                j -= 1

        return dp[n]

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值