题目描述
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
(给出n个非负整数代表一个海拔图,每一个柱形的宽度为1,计算在下雨之后可以存储多少水)
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.
(上面的海拔图用一个数组 [0,1,0,2,1,0,1,3,2,1,2,1] 代表,在这个例子中,可以存储6个单位的雨水)
Example:
Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
题目分析
这个题经过看了解决方案中的一个动态规划的方案,从左向右和从右向左两个方向分别找出到这个序号之前最高的柱子高度。
例如题目中的例子,从左到右的最高高度数组(max_left)是 [0,1,1,2,2,2,2,3,3,3,3,3] ,从右到左的最高高度数据(max_right)是 [1,2,2,2,3,3,3,3,3,3,3,3] ,这样最后遍历三个数组(两个方向的最高高度数组和一个原数组),每一个位置使用公式 water = min(max_left[i],max_right[i])−height[i]
计算的就是该位置的存水量(自己找一下两个数组计算一下就知道了)
代码示例
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
if(height == null)
return 0;
var ans = 0;
var size = height.length;
left_max = new Array(size)
right_max = new Array(size)
// 计算从左到右最大高度数组
left_max[0] = height[0];
for (var i = 1; i < size; i++) {
// 使用left_max数组的第n-1个值和height数组第n个值比较取大的就是left_max的第n个值
left_max[i] = Math.max(height[i], left_max[i - 1]);
}
console.log(left_max)
// 计算从右到左最大高度数组
right_max[size - 1] = height[size - 1];
for (var i = size - 2; i >= 0; i--) {
right_max[i] = Math.max(height[i], right_max[i + 1]);
}
console.log(right_max)
for (var i = 1; i < size - 1; i++) {
ans += Math.min(left_max[i], right_max[i]) - height[i];
}
return ans;
};