liuguanyu / quiz-every-meeting

8 stars 0 forks source link

2018-06-26 #16

Open wuxueguang opened 6 years ago

wuxueguang commented 6 years ago

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

image

上面是由数组 [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

测试

wuxueguang commented 6 years ago
/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(heights) {
    let l = heights.length;
    if(!l) return 0;
    let hs = heights.map((v, i) => [v, i]);

    hs.sort((a, b) => {
        return a[0] == b[0] ? a[1] - b[1] : b[0] - a[0];
    });
    let l_m_h_index = hs[0][1];
    let r_m_h_index = hs[0][1];
    let volume = 0;
    let spots = {[String(hs[0][1])]: 1};

    for(let i = 1; i < l; i++){
        let h = hs[i][0];
        let idx = hs[i][1];
        let tmp;

        if(idx < l_m_h_index){
            tmp = h * (l_m_h_index - idx - 1);
            l_m_h_index = idx;
        }else if(idx > r_m_h_index){
            tmp = h * (idx - r_m_h_index - 1);
            r_m_h_index = idx;
        }else{
            continue;
        }
        spots[String(idx)] = 1;
        volume += tmp;
    }

    heights.forEach((h, i) => {
        if(!spots[String(i)]) volume -= h;
    });

    return volume;
};