42. Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
Example:
Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
这个算法需要 left 和 right 两个指针分别指向数组的首尾位置,从两边向中间扫描,在当前两指针确定的范围内,先比较两头找出较小值,如果较小值是 left 指向的值,则从左向右扫描,如果较小值是 right 指向的值,则从右向左扫描,若遇到的值比当较小值小,则将差值存入结果,如遇到的值大,则重新确定新的窗口范围,以此类推直至 left 和 right 指针重合。
public int trap(int[] height) {
int l = 0,
r = height.length - 1,
maxHeight = 0, // 当前可容水量的最大高度
res = 0,
lower = 0;
while (l < r) {
if (height[l] < height[r]) {
lower = height[l];
l++;
} else {
lower = height[r];
r--;
}
maxHeight = Math.max(maxHeight, lower);
res += maxHeight - lower;
}
return res;
}
浙公网安备 33010602011771号