Trapping Rain Water

题目描述

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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值