解题思路
我的解题思路好像是全网目前知道的唯一一个哦~~
思考这题时,想到了那道
Candy 题. 那道扫描两遍.这题可不可以也扫描两遍呢?
答案是可以的.从左往右以当前bar i 为左bar,直到找比它大的bar j .如果找到,就算出两者的trap water.然后令i:=j,继续搜完.
从右往左同理的方式搜寻(其实就是把第一遍的每个bar当做右bar).不过这里要注意需要取等号.
解题代码:
public int trap (int [] A ) {
int sum= 0;
int i= 0;
while (i <A .length -1 )
{
//from left to right
if( A[ i]== 0){ //find first one that is not 0
i++;
} else
{
int j= i+ 1;
int curSum= 0;
while (j <A .length )
{
if( A[ j]> A[ i]) //find j that A[j] is higher than A[i]
{
break ;
} else
{
curSum+= A[ i]- A[ j]; //compute the trapped water
}
j++;
}
if( j< A. length) //only if the j is found
{
sum+= curSum;
}
i= j;
}
}
// from right to left
i= A. length- 1;
while (i >0 )
{
if( A[ i]== 0)
{
i--;
} else
{
int j= i- 1;
int curSum= 0;
while (j >=0 )
{
if( A[ j]>= A[ i]) break ;
else
{ curSum+= A[ i]- A[ j];
j--;}
}
if( j>= 0) sum+= curSum;
i= j;
}
}
return sum ;
}