给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

    示例 1:
    image.png
    输入: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

    1. /**
    2. * @param {number[]} height
    3. * @return {number}
    4. */
    5. var trap = function (height) {
    6. // 任意i装水为 Math.min('左', '右') - height[i]
    7. let n = height.length;
    8. if (n === 0) return 0;
    9. let res = 0;
    10. let arrL = new Array(n).fill(0);
    11. // 初始化
    12. arrL[0] = height[0];
    13. // 计算左右最大值
    14. for (let i = 1; i < n; i += 1) {
    15. arrL[i] = Math.max(height[i], arrL[i - 1])
    16. }
    17. let arrR = new Array(n).fill(0);
    18. arrR[n - 1] = height[n - 1];
    19. // 计算左右最大值
    20. for (let i = n - 2; i >= 0; i -= 1) {
    21. arrR[i] = Math.max(height[i], arrR[i + 1])
    22. }
    23. // 求和
    24. for (let i = 0; i < n; i += 1) {
    25. res += Math.min(arrL[i], arrR[i]) - height[i]
    26. }
    27. return res
    28. };

    image.png