如图所示,蓝色区域就是☔️积水区,现在需要计算这个值。
思路
以最高的柱子P为终点,从左L向P移动。
- 如果L右边的柱子L2的长度低于当前L的高度,那么在该柱子上可以累积array[L]-array[L2]的雨水量
- 如果L右边的柱子L2的长度大于等于当前L的高度,那么,L-L2实际上已经形成了一个池塘了
- 从L2开始往右寻找池塘,直至找到P
找到P之后,就不能这样找了,因为右边不存在可以与P形成池塘的柱子。所以,从最右边往左找,思路和上面一致。
代码
func trap(height []int) int {
var trap, i, j, t, maxIndex int
for i = 0; i < len(height); i = j {
t = 0
for j = i + 1; j < len(height); j++ {
if height[j] < height[i] {
t += height[i] - height[j]
} else {
maxIndex = j
trap += t
break
}
}
}
for i = len(height) - 1; i > maxIndex; i = j {
t = 0
for j = i - 1; j >= maxIndex; j-- {
if height[j] < height[i] {
t += height[i] - height[j]
} else {
trap += t
break
}
}
}
return trap
}