描述
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0)
![](https://img-blog.csdnimg.cn/img_convert/6a819d768a4a4624a0785367eca3d83c.png)
数据范围:数组长度 0 \le n \le 2\times10^50≤n≤2×105,数组中每个值满足 0 < val \le 10^90<val≤109 ,保证返回结果满足 0 \le val \le 10^9 \0≤val≤109
要求:时间复杂度 O(n)O(n)
输入:[3,1,2,5,2,4]
返回值:5
说明:数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水 ,如题面图。
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# max water
# @param arr int整型一维数组 the array
# @return long长整型
#
aaa = [3,1,2,5,2,4] # 测试用
class Solution:
def maxWater(self ,arr) -> int:
# write code here
if len(arr) == 0:
return 0
num = 0 # 存储雨滴数量
left = 0 # 左指针
right = len(arr) - 1 # 右指针
maxl = 0 # 左边最高的桶边
maxr = 0 # 右边最高的桶边
while left < right:
maxl = max(maxl, arr[left]) # 两个桶边对比取最大的
maxr = max(maxr, arr[right])# 两个桶边对比取最大的
if maxr > maxl:
num += maxl - arr[left] # 左边最高的桶边减去最低桶边
left += 1
else:
num += maxr - arr[right]# 右边最高的桶边减去最低桶边
right -= 1
return num
solu = Solution()
solu.maxWater(aaa)