题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
解题思路
仔细观察本图,我们可以得知,在数组的i
位置,能够接到的雨水的量,取决于当前元素左侧高度的最大值和右侧高度的最大值较小的那一个。能够接到的水量,为较小的高度最大值减去它自身的高度。于是,我们可以使用双指针来完成本题。
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
// 设置双指针
var left = 0,
right = height.length - 1,
// 设置两侧最大值
left_max = 0,
right_max = 0,
// 设置返回值
res = 0;
// 停止循环是两者相遇时
while( left <= right ){
if( left_max < right_max){
if( height[left] < left_max){
res += left_max - height[left];
}else{
left_max = height[left];
}
left++
}else{
if( height[right] < right_max){
res += right_max - height[right];
}else{
right_max = height[right];
}
right--
}
}
return res
};