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]