力扣--接雨水--解法记录

31 阅读1分钟

运行结果

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);    
};