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.

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

public class Solution {
    public int trap(int[] height) {
        if(height == null || height.length == 0 || height.length == 1) return 0;
        //对于每个 i 能盛水的量取决于左右两端高度的最小值  vol[i]=min(left[i],right[i]) - height[i]
        // 遍历两次得到最高右板和最高左板 left[],right[] 在遍历一次计算。
        int left[] =new int[height.length];
        int right[] = new int[height.length];
        
        //得到每个index的右最高板
        left[0] = height[0];
        int maxl = left[0];
        for(int i = 1; i < height.length; i++){
            left[i] = Math.max(maxl, height[i]);
            maxl = Math.max(maxl, height[i]);
        }
        
        //得到每个index的左最高板
        right[height.length-1] = height[height.length-1];
        int maxr = height[height.length-1];
        for(int i = height.length-2 ; i>=0; i--){
            right[i] = Math.max(maxr, height[i]);
            maxr = Math.max(maxr, height[i]);
        }
        
        int vol = 0;
        for(int i = 1 ; i < height.length-1 ; i++){
            int bit = Math.min(left[i], right[i]) - height[i];
            if(bit > 0) vol += bit;
        }
        return vol;
    }
}
原文地址:https://www.cnblogs.com/joannacode/p/6127906.html