接雨水
07/08/2021
题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 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 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
提示:
- n == height.length
- 1 <= n <= 2 * 104
- 0 <= height[i] <= 105
本人题解
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(heights) {
let left = [], leftMap = {}, result = 0;
heights.forEach((h, i) => {
if (h != 0) {
let comh = h, last = left.lastIndexOf(1), flag = true;
while(last != -1 && flag && comh > 0) {
let lastH = leftMap[last];
if (lastH <= comh) {
result += lastH * (i-last-1)
leftMap[last] = 0
left[last] = 0
comh -= lastH
last = left.lastIndexOf(1)
} else {
result += comh * (i - last -1)
leftMap[last] -= comh
flag = false
}
}
left[i] = 1;
leftMap[i] = h
}
})
return result;
};超出时间限制的一个解法 2025-3-14
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(heights) {
let left = 0, leftHeights = [...heights];
leftHeights.shift();
let result = 0;
while (left < heights.length) {
if (heights[left] === 0) {
left ++;
leftHeights.shift();
continue;
}
let next = leftHeights.findIndex(h => h >= heights[left]);
if (next === -1) {
const biggestNum = Math.max(...leftHeights);
const biggestIndex = leftHeights.indexOf(biggestNum);
next = biggestIndex;
}
if (next === 0) {
left++;
leftHeights.shift();
continue;
} else if (next === -1) {
break;
}
let _result = Math.min(heights[left], leftHeights[next]) * (next);
for (let i = 0; i < next; i++) {
_result -= leftHeights[i]
}
result += _result;
left += next;
leftHeights.splice(0, next);
}
return result;
};
分析
第一个解法忘了 =。= 第二个解法 找下一个可选的柱子的方法,不好找。