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/