380 字
2 分钟
代码随想录算法训练营第四十二天 | 单调栈 Part02

LeetCode 42. 接雨水#

题目链接

思路总结

  • 栈中存的是索引,栈顶是当前最低洼的“底”。

  • 若当前高度高于栈顶,说明可以计算雨水面积。

  • 一次计算一个低洼区域,直到无法再接水。

  • 栈中存的是索引,栈顶是当前最低洼的“底”。

  • 若当前高度高于栈顶,说明可以计算雨水面积。

  • 一次计算一个低洼区域,直到无法再接水。

class Solution:
def trap(self, height: List[int]) -> int:
stack = []
res = 0
for i in range(len(height)):
# 当前柱子比栈顶高,说明可以接水
while stack and height[stack[-1]] < height[i]:
bottom = stack.pop() # 取出低洼处
if not stack:
break # 左边界不存在,无法接水
left = stack[-1] # 左边界
width = i - left - 1
bounded_height = min(height[left], height[i]) - height[bottom]
res += width * bounded_height
stack.append(i)
return res

LeetCode 84. 柱状图中最大的矩形#

题目链接

思路总结

  • 维护一个递增栈,当当前柱子高度变矮时,就结算面积。
  • 每次出栈表示:当前高度无法继续向右延伸了。
  • 高度乘以宽度,更新最大面积。
  • 哨兵元素 0 保证最后栈中元素全部出栈。
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
stack = []
res = 0
heights.append(0) # 哨兵,确保栈清空
for i in range(len(heights)):
while stack and heights[stack[-1]] > heights[i]:
h = heights[stack.pop()]
# 计算宽度:如果栈为空,说明左边界为 -1,否则是 stack[-1]
w = i if not stack else i - stack[-1] - 1
res = max(res, h * w)
stack.append(i)
return res
代码随想录算法训练营第四十二天 | 单调栈 Part02
https://fuwari.vercel.app/posts/code_musings_day_forty-two/
作者
Jarrett
发布于
2025-07-29
许可协议
CC BY-NC-SA 4.0