"""
two-pointers && slide-window
HARD:
42. 接雨水
"""
question_list = [42,]
"""
42. 接雨水
双指针对撞,左右分区分别进行计算。每次只计算当前列能接多少雨水,累计求和。
DP解法略深奥,与模版有点冲突,忽略。
"""
def trap(self, height):
"""
1.还是指针对撞,每次移动矮的。高的作为移动指针围起来区域的另一个边不能动,所以要移动矮的。
2.按列累计求和,每次只计算当前列。
3.因为指针对撞,所以框架不变,还是以左右指针对比进行条件的区分,分别计算。
"""
left, right = 0, len(height) - 1
max_left_height, max_right_height = 0, 0
water = 0
while left < right:
if height[left] < height[right]:
cur_height = height[left]
if cur_height < max_left_height:
water += max_left_height - cur_height
else:
max_left_height = cur_height
left += 1
else:
cur_height = height[right]
if cur_height < max_right_height:
water += max_right_height - cur_height
else:
max_right_height = cur_height
right -= 1
return water