1. 程式人生 > 其它 >leetcode42.接雨水

leetcode42.接雨水

leetcode42.接雨水

題目

給定 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 個單位的雨水(藍色部分表示雨水)。
輸入:height = [4,2,0,3,2,5]
輸出:9

求解

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
    let len = height.length;
    let min = 0;
    let water = 0;
    let left = 0;
    let right = len-1;
    while(left<right){
        //先判斷左右指標哪個最小
        if(height[left]<height[right]){
            //是否大於已經計算過的雨量高度
            if(height[left]>min){
                //計算雨量
                for(let i = left+1;i<right;i++){
                    //去掉已經計算過一部分雨量的部分
                    if(height[i]<min){
                        water = water+(height[left]-min)
                    }else if(height[i]<height[left]){
                        water = water+(height[left]-height[i])
                    }
                }
                //更換新min
                min = height[left]
            }
            left++
        }else{
            if(height[right]>min){
                for(let i = left+1;i<right;i++){
                    if(height[i]<min){
                        water = water+(height[right]-min)
                    }else if(height[i]<height[right]){
                        water = water+(height[right]-height[i])
                    }
                }
                min = height[right]
            }
            right--
        }
    }
    return water
};