**
问题描述
**
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6
**
解题思路:
**
先找出最高的柱子,然后从两边向其遍历,如果后一个高度比前一个柱子高度低,则可以存水,存水量是两根柱子的差值
**
解题代码:
**
public static int trp(Integer[] height){
// 柱子数量
int length = height.length;
//存储水记录
int water = 0;
//左右两个下标
int l = 0,r = length - 1;
//左右存水水岸高度
int left_max = 0,right_max = 0;
while(l<r){
left_max = max(left_max,height[l]);
right_max = max(right_max,height[r]);
if(left_max<right_max){
water += left_max - height[l++];
}else{
water += right_max - height[r--];
}
}
return water;
}
::这个题因该是困难题中最简单的,不过在代码书写上需要注意,如果按照平常的平铺方法理解问题然后写代码,那么就需要三个方法(找最高柱子,从左开始遍历,从右开始遍历),将三个算法综合到一起,就得到上面代码,代码量相对来说少很多