接雨水问题
接雨水问题(双指针法)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
思路
在左右两边各设置一个指针移动,小的移动指针,同时记录下最大高度。以左边为例先是1,和右相等,右指针右移,高度变为 2,右高,所以左指针移动,变为0,但此时左指针最大高度为1所面积有1-0=1.继续左指针移动高度变为2,此时右指针移动,高度变为1,此时右指针最大高度为2,面积2-1=1.以此类推当左右指针碰到时,面积总和就是接的雨水。
代码如下
height_rain =[4,2,0,3,2,5]
left_rain = 0
right_rain = len(height_rain)-1
left_rain_max = 0
right_rain_max = 0
ans_rain = 0
while left_rain < right_rain:
#找到最大值
left_rain_max = max(left_rain_max, height_rain[left_rain])
right_rain_max = max(right_rain_max, height_rain[right_rain])
#左边大于右边时
if height_rain[left_rain] < height_rain[right_rain]:
ans_rain += left_rain_max - height_rain[left_rain]
left_rain += 1
#右边大于左边时
else:
ans_rain += right_rain_max - height_rain[right_rain]
right_rain -= 1
print(ans_rain)