题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例
输入:height = [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 个单位的雨水(蓝色部分表示雨水)。
示例2
输入:height = [4,2,0,3,2,5]
输出:9
提示:
- n == height.length
- 0 <= n <= 3 * 104
- 0 <= height[i] <= 105
然后我们的直观想法,如何才能存到水,首先至少需要3位才能存取起来我们的水。例如[1,0,1],左右两侧都非0的这个一个单独的数组,我们才可以存到水。之后呢,我们找到最高的轴,然后利用长方形长*宽,计算整个的面积。用整个面积 - 黑色区域面积 - 空白面积 = 雨水面积(图)
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
if(height.length <= 1) return; // 最少需要3位数组才能承接水
let max = height[0]; // 最大值
let maxIndex; // 最大值索引
let blackVolume; // 黑色区域面积
for(let i = 0; i < height.length; i++) {
blackVolume += height[i]; // 得到黑色区域面积 总得14
if(height[i] > max) {
max = height[i]; // 得到最高峰
maxIndex = i; // 最高峰值的序号
}
}
let volume = 0; // 空白面积
let leftValue = height[0]; // 左侧首位大小
for (let left = 0; i <= maxIndex; left ++) {
if(leftValue < height[left]) {
volume += left * (height[left] - leftValue); // 计算左边空白,计算1 + 3 + 7 左侧空白为11
leftValue = height[left]
}
}
let rightValue = height[height.length - 1]; // 右侧首位大小
for (let right = heilght.length; right >= maxIndex; right --) {
if(height[right] > rightvalue) {
volume += (height.length - right -1) * (height[right] - rightvalue); // 计算 1 + 4 右侧空白为5
rightvalue = height[right];
}
}
return max * height.length - blackVolume - volume; // 3 * 12 - 14 - 16 = 6
};
var Conf = (funtion () {
// 私有变量
var conf = {
MAX_NUM : 100,
MIN_NUM : 1,
COUNT : 10
}
// 返回取值器对象
return {
// 取值器方法
get: (name) => {
return conf[name] ? conf[name] : null;
}
}
}() )
”本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情