描述
给定一个整形数组arr**,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0)**
数据范围:数组长度** 0≤n≤2×10^5^,数组中每个值满足 0<val≤10^9^,保证返回结果满足 0≤val≤10^9^ **
样例
输入
3,1,2,5,2,4
输出
5
代码:
代码解析:
height = input().split(',') height = [int(x) for x in height]
- 这两行代码获取用户输入,并使用逗号分隔符将输入的字符串转换为一个字符串列表。
- 然后,使用列表推导式将字符串列表中的每个元素转换为整数,并将结果存储在
height
列表中。n = len(height) left, right = 0, n - 1 left_max, right_max = height[0], height[n - 1] summ = 0
- 这部分代码初始化了变量
n
,表示输入列表height
的长度。- 另外,定义了左指针(
left
)和右指针(right
),并初始化为列表的第一个元素和最后一个元素的索引。left_max
和right_max
分别表示左侧和右侧的最大高度,默认情况下分别设置为列表的第一个元素和最后一个元素的高度。- 最后,变量
summ
用于累计结果,初始化为0。while left <= right: left_max = max(left_max, height[left]) right_max = max(right_max, height[right]) if left_max < right_max: summ += left_max - height[left] left += 1 else: summ += right_max - height[right] right -= 1
- 这部分是主要的计算逻辑,使用双指针法遍历列表中的元素。
- 当左指针小于等于右指针时,执行循环。
- 在每次循环中,通过比较左右指针对应位置的高度,更新左侧最大高度(
left_max
)和右侧最大高度(right_max
)。- 如果左侧最大高度小于右侧最大高度,则计算并累加雨水量:
left_max - height[left]
,并将左指针右移一位。- 否则,计算并累加雨水量:
right_max - height[right]
,并将右指针左移一位。print(summ)
- 最后,打印累计的雨水量。