力扣学习算法五

153 阅读1分钟

42. 接雨水

本题你会发现我要是能直接把 当前位置最进 左面成下将趋势最高的 到右面下降趋势前最高的 找到这两个最小的然后在减去当前位置的高度是不是就是存水量呢

image.png

从左到又记录为a1 a2 a3

Min(a1,a3)-a2就是当前能存水的最大高度

我每个要是都能这样是不是很好呢

    let { length } = height;
    let leftMax = [];
    let rightMax = [];
    let total = 0
    //这里要从左往右面找 前一个比后一个高的
    for (let i = 0; i < length; i++) {
        if (i == 0) {
            leftMax[i] = height[i]
        } else {
            leftMax[i] = Math.max(leftMax[i - 1], height[i])
        }
    }
    //这里要从右往左找同理 找后一个比前一个大的
    for (let i = length - 1; i >= 0; i--) {
        if (i == length - 1) {
            rightMax[i] = height[i]
        } else {
            rightMax[i] = Math.max(rightMax[i + 1], height[i])
        }
    }
    //Min(a1,a3)-a2就是当前能存水的最大高度 然后进行求出可以累计的水量
    for (let i = 0; i < length; i++) {
        var min = Math.min(rightMax[i], leftMax[i])
        var result = min - height[i]
        if (result > 0) {
            total += result
        }
    }
    return total
};