收集雨水。题意是给一个整数数组,数组包含的是一堆高度不同的bar,表示的是一个高度图(elevation map)。求此高度图能存水多少。例子,

这个题目有多种思路,此处我给出的是双指针解法(two pointer)。思路是对于任意位置i,在i上的积水,是由其左右两边较矮的bar(可以想象为挡板)的高度和积水本身高度的差值决定的。即volume[i] = Math.min(Math.min(left[i], right[i]) - A[i]) * 1。这里的1是宽度。所以写代码的时候需要从左往右和从右往左各扫一遍,这样可以得出在每个位置上因着左边的bar和右边的bar的高度,能存水多少。代码如下,

时间O(n)

空间O(1)

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
    let left = 0;
    let right = height.length - 1;
    let res = 0;
    let leftMax = 0;
    let rightMax = 0;
    while (left < right) {
        if (height[left] < height[right]) {
            leftMax = Math.max(leftMax, height[left]);
            res += leftMax - height[left];
            left++;
        } else {
            rightMax = Math.max(rightMax, height[right]);
            res += rightMax - height[right];
            right--;
        }
    }
    return res;
};
02-12 06:09