42.接雨水|刷题打卡

124 阅读1分钟

题目描述

给定 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 春招闯关活动」, 点击查看 活动详情