Open wuxueguang opened 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;
};
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [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
测试