42.接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图
计算按此排列的柱子,下雨之后能接多少雨水。
解析:任何一个位置 i 能够接住的雨水的量都是它左边最高的柱子和右边最高的柱子的较小值减去它本身
也就是说代码可以分为几个步骤:
- 遍历一遍数组,用另外一个数组 l_max 记录这个位置左侧的最高峰
- 再遍历一遍,只不过从右到左,用一个数组 r_max 记录这个位置右侧的最高峰
- 用我们上图中总结的思路,左右两侧最高峰的较小值减去自己,则可以得到这个位置的雨水量
代码:
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
if(height.length === 0) {
return 0
}
// 用两个数组分别记录每一个位置的左边的最高柱子和右边的最高柱子
let l_max = new Array(height.length)
let r_max = new Array(height.length)
l_max[0] = height[0]
r_max[height.length - 1] = height[height.length - 1]
for(let i = 1; i < height.length; i++) {
l_max[i] = Math.max(height[i], l_max[i-1])
}
for(let i = height.length - 2; i >= 0; i--) {
r_max[i] = Math.max(height[i], r_max[i+1])
}
// 遍历得到结果
let res = 0
for(let i = 1; i < height.length - 1; i++) {
res += Math.min(l_max[i], r_max[i]) - height[i]
}
return res
};