接雨水-LeetCode

给定 n 个非负整数表示每一个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨以后能接多少雨水。git

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种状况下,能够接 6 个单位的雨水(蓝色部分表示雨水)。github

示例:数组

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

思路

        使用二分查找,找到最高的位置,今后处一分为二,A左边的从左往右遍历,B右边的从右往左遍历,spa

        A左边:左边>右边, 左边-右边为雨水量;blog

        B右边:右边>左边, 右边-左边为雨水量;索引

        加在一块儿就是总量。get

public static int trap(int[] height) {
    int sum = 0;//雨水总数

    int max = 0;//最大值
    int maxIndex = 0;//最大值索引
    for(int i =0 ;i< height.length; i++){
        if (max < height[i]){
            max = height[i];
            maxIndex = i;
        }
    }

    int maxLeft = 0;//左边最大
    //遍历左边,从左往右遍历 小于最大值索引
    for (int a=0 ; a<maxIndex; a++){
        int i = height[a];
        //若是当前值大于等于左边最大值
        if (i >= maxLeft){
            //将当前值赋值给左边最大值
            maxLeft = i;
        }else{
            //若是当前值小于左边最大值,左边最大值减去当前值
            sum+= maxLeft-i;
        }
    }

    int maxRight = 0;//右边最大
    //遍历右边,从右往左遍历 小于最大值索引
    for (int b = height.length-1; b > maxIndex; b--){
        int j = height[b];
        //若是当前值大于等于右边最大值
        if (j >= maxRight){
            //将当前值赋值给左边最大值
            maxRight = j;
        }else{
            //若是当前值小于右边最大值,右边最大值减去当前值
            sum += maxRight - j;
        }
    }
    return sum;
}


public static void main(String[] args){
    int[] height={0,1,0,2,1,0,1,3,2,1,2,1};
    System.out.print(trap(height));
}

 

LeetCode 所有题目讲解与答案,可移步 GitHub:https://github.com/yan-qiang/LeetCodeit

相关文章
相关标签/搜索