接雨水

302 阅读1分钟

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

img

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

解题思路: 建两个数组maxL maxR,maxL数组保存从左到右的最大高度 , maxR保存从右到左的最大高度;然后遍历height数组 ,每个位置的雨水高度为 maxL和 maxR的最小值 - 当前高度。

class Solution {
    public int trap(int[] height) {
        int len = height.length - 1;
        int[] maxR = new int[ len + 1];
        int[] maxL = new int[ len + 1];
        int max1 = 0 , max2 = 0;
        for( int i = len  ; i >= 0 ; i-- ){
            max1 = Math.max( max1 , height[ i ] );
            maxR[ i ] = max1;
            max2 = Math.max( max2 , height[len - i ] );
            maxL[ len -  i ] = max2;
        }
        int res = 0;
        for( int i = 0 ; i <= len ; i++ ){
            int min = Math.min( maxL[ i ] , maxR[ i ] );
            res += min - height[ i ];
       }
        return res;
    }
}