题解 | #接雨水问题#

接雨水问题

http://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f

思路:
先判断 最左最右哪边高,如果右边高于左边则 先执行 左边的循环,
left_max用来记 当前柱子height[i] 与左边最大的值left_max比较(因为左边小于右边,所以只有小于左边,才能存储水),且存储的水量为 left_max 和当前柱 height[i]的差值。
同理,当遍历到有一个柱的高度高于右边,就将该柱当最高,然后开始从右往左遍历,这里遍历的是比右边小的 height[right] (与左边的同理,只有这样才能存储水,因为这时,左边最高,以左最大left_max和右最大right_max作为桶,当前的柱高度作为厚度,那么存储的水量自然就是与右最大right_max的差值)

 public long maxWater (int[] arr) {
            //双指针 ,分别为左、右、左最大、右最大,返回值ans
        int left=0,right=arr.length-1,
            left_max=0,right_max=0;
                long ans=0L;

        //循环
        while(left<right){  //当 left=right时,此时表示的是同一个柱子,循环则结束
            if(arr[left]<arr[right]){   //判断左边高还是右边高,如果右边高进入下面的if判断
                if(arr[left]>left_max){    //进入到这里,是右边高于左边,如果柱子高度大于左边最大left_max则存不了水,就存当前为最大,进入下一次if判断(这里有left++)
                    left_max=arr[left];    //左边最大置于 目前所处的arr[left]
                }else{    //如果小于左边最大left_max,这时符合桶的含义,可以存储水量,但这时左边最高left_max<右边最高right_max
                    ans+=left_max-arr[left];  //这里已经确定了左边的最大值小于右边的right
                }
                left++;    //进行下一次判断

            //与上面同理
            }else{
                if(arr[right]>right_max){
                    right_max=arr[right];
                }else{
                    ans+=right_max-arr[right];
                }
            right--;
            }
        }
            return ans;

    }
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-29 17:30
找实习找着找着就要进入7月了,马上秋招也要开始了,找实习还有意义吗?
绝迹的星:有面就面, 没面上就当日薪4位数大佬免费培训, 面上了再考虑要不要实习
点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 11:47
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务