🚀总结
- 对于每一个柱子,它所能接到的雨水量并不取决于它相邻左右两侧的柱子高度,而取决于它【左右两侧的最高的柱子高度】;
- 类似于 11. 盛最多水的容器,由于“短板效应”,每个柱子的接水量取决于它左右两侧最高的柱子中较矮的那一个;
- 使用对向双指针,遍历的同时,完成:
- 判断哪边是短板;
- 根据短板计算当前柱子的接水量;
- 将短板向内移动;
- 更新当前左右两侧最高的柱子高度。
📇题目
⭐思路
- 初始化:左指针初始化为数组第一个位置,右指针初始化为数组最后一个位置;左侧最高点初始化为左指针为数组第一个高度,右侧最高点初始化为数组最后一个高度;
- 只要左右指针还没有重复:
- 判断当前的短板是哪边(根据左右两侧最高点);
- 根据短板计算当前柱子可接雨水量;
- 短板向内移动;
- 判断是否需要更新短板高度;
- 返回最终结果
🛠️代码
class Solution:
def trap(self, height: List[int]) -> int:
res = 0
l = 0
r = len(height) - 1
left_max = height[l]
right_max = height[r]
while l < r:
if left_max > right_max:
res += right_max - height[r]
r -= 1
if height[r] > right_max:
right_max = height[r]
else:
res += left_max - height[l]
l += 1
if height[l] > left_max:
left_max = height[l]
return res