题目描述:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
题解思路:
我们考虑每个柱子上面能接的雨水是由什么决定的,不难得出,每根柱子上能接的雨水是由它左边的最高的柱子和他右边的最高的柱子中的最小值决定的。那么我们可以维护一个前缀最大值和一个后缀最大值,最终我们就可以得出每根柱子上面能接多少雨水,最后把每根柱子上面接的雨水加起来就是最终答案
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
let len = height.length
let lm = new Array(len)
let rm = new Array(len)
for(let i = 0; i < len; i++) {
if(i == 0)lm[i] = height[i]
else lm[i] = Math.max(lm[i-1],height[i])
}
for(let i = len - 1; i >= 0; i--) {
if(i == len - 1)rm[i] = height[i]
else rm[i] = Math.max(rm[i+1],height[i])
}
let ans = 0
for(let i = 1; i < len - 1; i++) {
ans = ans + Math.min(lm[i],rm[i]) - height[i]
}
return ans
};