给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6
int trap(int* height, int heightSize){
int max_pos=-1,max=0;
for(int i=0;i<heightSize;++i)
{
if(height[i]>max)
{
max=height[i];
max_pos=i;
}
}
int total=0,sum=0,left=0,right=max_pos-2,begin;
while(left<=right)
{
if(height[left]==0||height[left+1]>=height[left])
{
left++;
continue;
}
begin=left++;
sum=height[begin]-height[left++];
while(left<=max_pos)
{
if(height[left]>=height[begin])
{
break;
}
sum+=height[begin]-height[left++];
}
total+=sum;
sum=0;
}
sum=0;
left=max_pos+2;
right=heightSize-1;
while(right>=left)
{
if(height[right]==0||height[right-1]>=height[right])
{
right--;
continue;
}
begin=right--;
sum=height[begin]-height[right--];
while(right>=max_pos)
{
if(height[right]>=height[begin])
{
break;
}
sum+=height[begin]-height[right--];
}
total+=sum;
sum=0;
}
return total;
}
执行用时 : 16 ms, 在Trapping Rain Water的C提交中击败了51.48% 的用户
内存消耗 : 7.4 MB, 在Trapping Rain Water的C提交中击败了83.33% 的用户
1.寻找最大数的那次遍历可以省去,正序循环退出时,若sum>0,且begin<heightSize-2即可说明此时begin处的位置是
height数组[begin,heightSize)的最大值,以此处作为逆序遍历的终点即可。