题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6
题目分析
只有低洼处才能接雨水,且接的雨水多少取决于低洼处边沿最低的地方。因此需要至少3个整数,且左右两边的整数大于中间的整数,接的雨水数等于左右整数间最小值和中间值的差值。
解题思想是从整数序列两端开始寻找可能存在的低洼边沿。
1)以两端中的小值或等值为低洼最低的边沿,并依次向内比较。
2)若最低边沿内的第一个值大于等于最低边沿,则将该值替换为最低边沿,并重复1)步骤;若小于最低边沿,则这两值的差值即为接的一部分雨水。
3)重复2)步骤,直至left = right -1。
4)最后汇总的雨水即为接的雨水数。
题目解答
func trap(height []int) int {
water, len := 0, len(height)
if len <= 2 {
return water
}
left, right := 0, len-1
leftMax, rightMax := height[left], height[right]
for left < right {
if leftMax <= rightMax {
left++
if height[left] < leftMax {
water += leftMax - height[left]
} else {
leftMax = height[left]
}
} else {
right--
if height[right] < rightMax {
water += rightMax - height[right]
} else {
rightMax = height[right]
}
}
}
return water
}