问题描述:给定n个非负整数表示每个宽度为1的柱子的高度,计算按此排列的柱子,下雨之后能接多少雨水。
三指针求解:首先找到最高的柱子的位置,然后将其一分为二,统计左侧的蓄水量和右边的蓄水量,相加即可。首先左侧的算法:若左侧比右侧高则一定能构成蓄水池,水量为right-left,若出现right-left的情况则更新左指针,且右指针++。
public int rainFall(int []nums)
{
int top=0;
int topValue=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++)
{
if(nums[i]>topValue)
{
top=i;
topValue=Math.max(topValue,nums[i]);
}
}
int startLeft=0;
int endLeft=1;
int sum=0;
while(endLeft<top)
{
if(nums[startLeft]>nums[endLeft])
{
sum+=nums[startLeft]-nums[endLeft];
}else
{
startLeft=endLeft;
endLeft++;
}
}
int starRight=nums.length-1;
int endRight=nums.length-2;
while(endRight>top)
{
if(nums[endRight]<nums[starRight])
{
sum+=nums[starRight]-nums[endRight];
}else
{
starRight=endRight;
endRight--;
}
}
???????return sum;
}