【双向指针】接雨水问题

一、题目描述

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

示例:

【双向指针】接雨水问题_第1张图片

二、思路

盛水最多容器的升级版,用两个数组分别记录每个 i 的前缀最大值和后缀最大值 , 这样就能求出每一个小格能盛水的量,然后累加每个小格即可。

图解:

【双向指针】接雨水问题_第2张图片

三、代码

class Solution {
    // 接雨水
    public int trap(int[] height) {
        int res = 0;
        int len = height.length;
        int[] preMax = new int[len];
        int[] sufMax = new int[len];
        preMax[0] = height[0];
        sufMax[len-1] = height[len-1];
        for(int i=1; i<len; i++){
            preMax[i] = Math.max(preMax[i-1], height[i]);
        }
        for(int i=len-2; i>=0; i--){
            sufMax[i] = Math.max(sufMax[i+1], height[i]);
        }
        
        for(int i=0; i<len; i++){
            res += (Math.min(sufMax[i], preMax[i]) - height[i]);
        }
        
        return res;
    }
}

你可能感兴趣的:(算法题,算法,数据结构,Java)