题解 | #接雨水问题#

接雨水问题

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

import java.util.*;


public class Solution {
    /**
     * Java版 《容器盛水问题》
     * 思路分析:
     * 因为要该容器是一个高低不平的容器,所以我们直接找出容器的左右边界,很明显,
     * 为了不让水溢出来,容器的边界肯定取那个更低的。
     * 然后使用双指针,分别从两边往中间扫描,
     * 如果此时左边arr[left]的高度小于右边的高度时,
     * 左指针向右扫描+1,如果此时当前位置的高度小于容器的边界高度,
     * 那么意味着此位置可以盛水;反之,则右指针向左扫描-1。
     * @param args
     */
    public long maxWater (int[] arr) {

        if(arr.length == 0 || arr.length <= 2){
            return 0;
        }

        int left = 0;
        int right = arr.length-1;
        int min = Math.min(arr[left],arr[right]);

        //注意 这里一定要为long类型 否则有情况会超出Integer类型数值范围
        long result = 0;

       while(left < right){
            if(arr[left] < arr[right]){
                left++;
                //如果当前水位小于边界,则可以装水
                if(arr[left] < min){
                    result += min-arr[left];
                }else{
                    min = Math.min(arr[left],arr[right]);
                }
            }else{
                right--;
                if(arr[right] < min){
                    result += min-arr[right];
                }else{
                    min = Math.min(arr[right],arr[left]);
                }
            }
        }
         return result;
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 13:05
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 17:10
点赞 评论 收藏
分享
06-10 23:36
已编辑
首都经济贸易大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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