这是一道很有趣的问题,需要根据输入的所有柱子的高度求出其能容纳的雨水的最大容量。在观察这个数据的性质后,我发现,雨水的容量都是由其中较高的两根柱子决定的,如果其中没有柱子,容纳的雨水直接就是长*高得到的矩形;如果有比他们矮的柱子,那就减掉这个柱子占有的空间,也就是它的高度即可。所以我的思路是从前至后记录最高的两个柱子,每次出现一次比之前高或者和之前一样高的柱子就计算一次,用二者较短的高度乘以二者之间的距离,然后减掉二者中间的柱子占有的体积。但是这种如果直接从左到右扫描的话扫到了最高的就不能再继续了。我处理这个问题的思路是把最高的一直到最后的所有柱子反序过来,这样最高的肯定在最后,然后就可以用之前相同的思路去扫描计算了。本题还要注意的还有一些边界条件,比如计算体积的时候两个柱子之间距离要大于1等等。
代码如下:
class Solution {
public int trap(int[] height) {
int start=0,end=height.length-1;
int r1=cal(height,start,end);
return r1;
}
public int cal (int []height, int front, int end)
{
if (front>=end-1) return 0;
int max=0;
int index=front;
int sum=0;
for (int i=front;i<=end;i++)
{
if (height[i]!=0 && height[i]>=max)
{
if (max!=0 && i-index>1)
{
sum+=Math.min(height[i],max)*(i-index-1);
for (int j=index+1;j<i;j++)
{
sum-=height[j];
}
}
max=height[i];
index=i;
}
}
if (index<end-1)
{
int len=end-index+1;
int []reverse=new int[len];
for (int i=0;i<len;i++) reverse[i]=height[end-i];
sum+=cal(reverse,0,len-1);
}
return sum;
}
}