收集雨水。题意是给一个整数数组,数组包含的是一堆高度不同的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; };