题目
描述
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0)
要求:空间复杂度 O(1),时间复杂度 O(n)
思路
每一个位置的雨水是由它“左边最高和右边最高中最小的”决定的,所以第一个位置和最后一个位置肯定不会接到雨水,我们从左往右开始遍历,每走一步前判断是否要更新左边最高和右边最高。同时如果每走一步的值和上一步相同,就不需要再更新。
代码
python版本:
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# max water
# @param arr int整型一维数组 the array
# @return long长整型
#
class Solution:
def maxWater(self , arr: List[int]) -> int:
# write code here
if(len(arr)<3):
return 0
left_max = arr[0]
right_max = max(arr[2:])
water = 0
for i, ele in enumerate(arr[1:-1]):
value = min(right_max, left_max)-ele
if value>0:
water += value
if(arr[2+i]==arr[1+i]):
continue
if(ele>left_max):
left_max = ele
if(ele==right_max):
right_max = max(arr[2+i:])
return water
c++版本:
无