42. Trapping Rain Water - jiejackyzhang/leetcode-note GitHub Wiki

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.

For example,

Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

解题思路为two pointers。 注意到water的面积可以通过water和block的总面积减去block的面积得到。 总面积可以看到是大致以最高的那个block为中心分布的。

因此可以采用双指针逐步向最高点靠近。 左右指针较低的那个为limit,若为当前的高度curLevel,则(r-l+1)*(curLevel-level)肯定在总面积中。

public class Solution {
    public int trap(int[] height) {
        if(height == null || height.length == 0) return 0;
        int l = 0, r = height.length-1;
        int level = 0;
        int all = 0, block = 0;
        while(l <= r) {
            int curLevel = Math.min(height[l], height[r]);
            if(curLevel > level) {
                all += (r - l + 1) * (curLevel - level);
                level = curLevel;
            }
            if(height[l] < height[r]) {
                block += height[l++];
            } else {
                block += height[r--];
            }
        }
        return all - block;
    }
}