第十章 单调栈 Part2

任务

42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

思路

按照横向计算,单调栈的思路得到 left和right,然后得到h 和 w,最终累加结果。

class Solution:
def trap(self, height: List[int]) -> int:
stack = []
result = 0
for i in range(len(height)):
if len(stack) > 0 and height[i] <= height[stack[-1]]:
stack.append(i)
else:
while len(stack) > 0 and height[i] > height[stack[-1]]:
mid = stack[-1]
stack.pop()
if len(stack) > 0:
left = stack[-1]
right = i
h = min(height[left],height[right]) - height[mid]
w = right - left -1
result += h * w
stack.append(i)
return result

84. 柱状图中最大的矩形

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

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

思路

对于某根柱子,找到左边第一个比它小的和右边第一个比它小的,中间的部分即是当前柱子能够构成的最大面积。需要注意在数组左右两边添加0来保证首尾柱子的正确计算(或者理解为当特殊情况比如数组单调递增或单调递减时的正确处理)

class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
stack = []
result = 0
# 头部尾部加0
heights.insert(0,0)
heights.append(0)
for i in range(len(heights)):
if len(stack) > 0 and heights[i] >= heights[stack[-1]]:
stack.append(i)
else:
while len(stack) > 0 and heights[i] < heights[stack[-1]]:
mid = stack[-1]
stack.pop()
if len(stack) > 0:
left = stack[-1]
right = i
result = max(result,heights[mid] * (right - left -1))
stack.append(i)
return result
posted @ 2024-09-03 12:06  haohaoscnblogs  阅读(8)  评论(0)    收藏  举报
相关博文:
阅读排行:
· 完成微博外链备案,微博中直接可以打开园子的链接
· 推荐 3 种 .NET Windows 桌面应用程序自动更新解决方案
· .NET 10 支持Linux/Unix 的Shebang(Hashbang)
· 上周热点回顾(6.9-6.15)
· 记一次 .NET 某SaaS版CRM系统 崩溃分析
点击右上角即可分享
微信分享提示