目录
问题描述
给定一个非负整数数组 height
,每个元素表示柱子的高度。假设这些柱子排列紧密,计算下雨后这些柱子之间能接多少雨水。例如,输入 [0,1,0,2,1,0,1,3,2,1,2,1]
,输出为 6。
解法思路:动态规划
核心思想
每个位置能接的雨水量取决于其左右两边最高墙中的较矮者。若较矮的墙高于当前柱子,则积水量为两者之差;否则无法积水。
步骤解析
-
预处理左右最高墙:
-
left[i]
:记录位置i
左边的最高墙(不包含i
)。 -
right[i]
:记录位置i
右边的最高墙(不包含i
)。
-
-
计算积水量:遍历每个位置,取左右最高墙中的较小值,减去当前高度,累加到结果中。
代码实现
/**
* @param {number[]} height
* @return {number}
*/
var trap = function (height) {
let n = height.length;
let left = new Array(n).fill(0); // 左边最高的墙
let right = new Array(n).fill(0); // 右边最高的墙
for (let i = 1; i < n; i++) {
// 从左到右遍历,记录每个位置左边最高的墙
left[i] = Math.max(left[i - 1], height[i - 1]);
}
for (let i = n - 2; i >= 0; i--) {
// 从右到左遍历,记录每个位置右边最高的墙