https://oj.leetcode.com/problems/trapping-rain-water/

http://fisherlei.blogspot.com/2013/01/leetcode-trapping-rain-water.html


public class Solution {
    public int trap(int[] A) {
            
        // 对于某坐标 有
        // - leftmax 它左边最高
        // - rightmax 它右边最高
        // - val 它本身高度
        // 那么它的容积为 max( min(leftmax, rightmax) - val, 0 )
        
        // 那么从左向右遍历 创建 leftmax[]
        // 类似 从右向左遍历 创建 rightmax[]
        // 最后遍历一遍 计算容积 求和
        // O(n)
        
        // Input validations.
        if (A == null || A.length == 0)
            return 0;   // Invalid input.
        
        int len = A.length;
        
        // Build leftmax[]
        int[] leftmax = new int[len];
        int seenleftmax = 0;
        for (int i = 0 ; i < len ; i ++)
        {
            leftmax[i] = seenleftmax;
            if (A[i] > seenleftmax)
                seenleftmax = A[i];
        }
        
        // Build rightmax[]
        int[] rightmax = new int[len];
        int seenrightmax = 0;
        for (int i = len - 1 ; i >= 0 ; i --)
        {
            rightmax[i] = seenrightmax;
            if (A[i] > seenrightmax)
                seenrightmax = A[i];
        }
        
        // Calculate result
        int result = 0;
        for (int i = 0 ; i < len ; i ++)
        {
            int v = Math.max(Math.min(leftmax[i], rightmax[i]) - A[i] , 0);
            result += v;
        }
        return result;
    }
}