Trapping Rain Water

解题思路



我的解题思路好像是全网目前知道的唯一一个哦~~
思考这题时,想到了那道  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 ;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值