一、题目:42. 接雨水
![](https://img-blog.csdnimg.cn/img_convert/136ad8714afe44a39e29eeca650317ac.png)
二、题目解析:
现实生活中,一个水塘能够积水的高度其实就是水面到水塘底的距离,最大容量是由两边最低高度确定的。
回到此题:
一个能接雨水的区域,应该由左边界、右边界、底部 构成的。
如果第 i 个位置能够作为底层,则它的左边和右边肯定都是比它高的。
如果第 i 列能够作为底层,则它能够接的雨水就是由左右边界的最小值确定的。
解题步骤:
将雨水分成一列一列来计算
该列能累计的雨水由 它 左边最大值和右边最大值 中较小的来确定的
如果该列左右两边的最小值比该列的高度小,则说明该列不能接雨水,需要跳过
图示帮助理解:
![](https://img-blog.csdnimg.cn/img_convert/45e8f38d9ae2452180f234e481b15936.png)
三、代码如下:
@Test
public void test(){
int[] arr = {0,1,0,2,1,0,1,3,2,1,2,1};
System.out.println(trap(arr));
}
public int trap(int[] height){
int ans = 0;
int rigMax[] = new int[height.length];
int maxx = 0;
//初始化每个元素右侧高度最大值
for (int i = height.length-1; i >=0;i--) {
rigMax[i] = maxx;
maxx = Math.max(maxx,height[i]);
}
maxx=0;
//初始化每个元素左侧高度最大值
int leftMax[] = new int[height.length];
for (int i = 0; i < height.length; i++) {
leftMax[i] = maxx;
maxx = Math.max(maxx,height[i]);
}
//开始计算 累加能够接的雨水容量
for (int i=0;i<height.length;i++){
ans+=Math.max(Math.min(leftMax[i],rigMax[i]) - height[i],0);
}
return ans;
}
四、测试
![](https://img-blog.csdnimg.cn/img_convert/e484325bbd53431ca0868ef3387dab0c.png)
五、结束