运行结果
322 / 322 个通过测试用例
状态:通过
执行用时: 1508 ms
内存消耗: 61.1 MB
思路: 给出的数组:每次减去数组中大于0的最小值, 之后去掉开头结尾中,小于等于0的元素。得到的数组正好是第二行数组。以此递归循环。
例:
height: 0,1,0,2,1,0,1,3,2,1,2,1 start 1 end 0 min 1
new : 1,0,2,1,0,1,3,2,1,2,1
height: 0,0,1,0,0,0,2,1,0,1,0 start 2 end 1 min 1
new : 1,0,0,0,2,1,0,1
height: 0,0,0,0,1,0,0,0 start 4 end 3 min 1
new : 1
6
var trap = function (height) {
function isTrapInner(height, sum){
var start = 0, end = 0, p = false;
len = height.length, min = height[0];
if (!len || len == 1) {
return sum;
}
for (var i = 0; i < len; i++) {
var cur = height[i];
if (cur <= 0) {
end++;
continue
}
if (!p) {
start = i;
p = true;
}
end = 0;
if (min <= 0 || min > cur) {
min = cur;
}
}
height = height.slice(start, len - end);
start = 0;
end = height.length;
for (var i = start; i < end; i++) {
if (height[i] <= 0) {
sum += min;
} else {
height[i] -= min;
}
}
return function() {
return isTrapInner(height, sum)
};
}
function trampoline (func, height, sum) {
var value = func.call(null, height, sum)
while(typeof value === "function") {
value = value();
}
return value;
}
return trampoline.bind(null, isTrapInner)(height, 0);
};