给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5] 输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
代码:
from typing import List
class Solution:
def trap(self, height: List[int]) -> int:
# 获取高度列表的长度
n = len(height)
# 初始化一个数组 left,用于存储每个位置左侧的最大高度
left = [0] * n
# 第一个位置的左侧最大高度就是它本身
left[0] = height[0]
# 从左到右遍历高度列表,计算每个位置左侧的最大高度
for i in range(1, n):
# 当前位置的左侧最大高度是前一个位置的左侧最大高度和当前高度的较大值
left[i] = max(left[i - 1], height[i])
# 初始化一个数组 right,用于存储每个位置右侧的最大高度
right = [0] * n
# 最后一个位置的右侧最大高度就是它本身
right[n - 1] = height[n - 1]
# 从右到左遍历高度列表,从倒数第二个,到下标为0,第三个数为步长,计算每个位置右侧的最大高度
for i in range(n - 2, -1, -1):
# 当前位置的右侧最大高度是后一个位置的右侧最大高度和当前高度的较大值
right[i] = max(right[i + 1], height[i])
# 初始化变量 area,用于存储总的雨水量
area = 0
# 使用 zip 函数将 left、right 和 height 三个列表的元素配对,遍历每个位置
for l, r, h in zip(left, right, height):
# 当前位置能接的雨水量等于左侧最大高度和右侧最大高度的较小值减去当前高度
# 将每个位置的雨水量累加到 area 中
area += min(l, r) - h
# 返回总的雨水量
return area
思路:
左右先各来一个队列,从左到右依次按最大高度取(0,1,1,2,2,2,2,3,3,3,3,3), 从右到左依次按最大高度取(1,2,2,2,3,3,3,3,3,3,3,3),
同一位置取最小值,再减去其高度,总和后,即为接雨水量。
【盛最多水的容器 接雨水【基础算法精讲 02】】https://www.bilibili.com/video/BV1Qg411q7ia?vd_source=54681c73586a5c960272ad97d116f206