42. 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.


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. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

思路:先找出每个小坑,然后把小坑合并,直到不能合并为止

这道题目以前打比赛的时候做过,但还是花了很长的时间,有很多的坑,最重要的是要想到,小坑可以合并成大坑

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
    let len = height.length
    let ans = 0
    let left = 0
    let right, index = 1
    let flag1 = false
    let flag2 = false
    let pointArr = []
    let set = new Set()
    while(index + 1 < len) {
        flag1 = false
        flag2 = false
        while(index < len && height[index] >= height[left]) {
            left = index
            index ++
        }
        while(index < len && height[index] >= height[index + 1]) {
            index ++
        }
        if(index < len && height[index] <= height[left]) flag1 = true
        while(index < len && height[index] <= height[index + 1]) {
            index ++
            flag2 = true
        }
        if(flag1 && flag2) {
            right = index
            pointArr.push([left, right])
            left = right
        }
    }
    let pointLen
    let ans2
    while(true){
        ans2 = []
        pointLen = pointArr.length
        for(let i = 0; i < pointLen; i ++) {
            let left = pointArr[i][0]
            let right = pointArr[i][1]
            if(i + 1 < pointLen) {
                let left2 = pointArr[i + 1][0]
                let right2 = pointArr[i + 1][1]
                while(right === left2 && height[right] <= height[right2] && height[right] <= height[left]) {
                    right = right2
                    i ++
                    if(i + 1 < pointLen) {
                         left2 = pointArr[i + 1][0]
                         right2 = pointArr[i + 1][1]
                    }else break
                }
            } 
            ans2.push([left, right])
        }
        if(ans2.length != pointLen) {
            pointArr = ans2
            ans2 = []
        }else break
    }
    for(let i = 0; i < ans2.length; i ++) {
        let left = ans2[i][0] 
        let right = ans2[i][1]
        let maxHeight = Math.min(height[left], height[right])
        for(let j = left + 1; j < right; j ++) {
            if(maxHeight > height[j])
                    ans += maxHeight - height[j]    
        }
    }
    return ans
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值