题解 | #接雨水问题#

接雨水问题

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

import java.util.*;


public class Solution {
    /**
     * max water
     * @param arr int整型一维数组 the array
     * @return long长整型
     */
    public long maxWater (int[] arr) {
        // write code here
        if (arr == null || arr.length == 0) return 0;

        int lastIdx = arr.length - 2;
        int[] leftMaxes = new int[arr.length];
        for (int i = 1; i <= lastIdx; i++) {
            leftMaxes[i] = Math.max(leftMaxes[i - 1], arr[i - 1]);
        }

        int[] rightMaxes = new int[arr.length];
        for (int i = lastIdx; i >= 1; i--) {
            rightMaxes[i] = Math.max(rightMaxes[i + 1], arr[i + 1]);
        }

        // 遍历每一根柱子,看看每一根柱子上能放多少水
        int water = 0;
        for (int i = 1; i <= lastIdx; i++) {
            // 求出左边最大、右边最大中的较小者
            int min = Math.min(leftMaxes[i], rightMaxes[i]);
            // 说明这根柱子不能放水
            if (min <= arr[i]) continue;
            // 说明这根柱子能放水
            water += min - arr[i];
        }

        return water;
    }
}

解题思路:遍历,求出左右两边最大值,然后取最小的然后减去当前扫描值就是获取的当前扫描值水量。

#算法##算法笔记#
全部评论

相关推荐

1个小白:可以考虑投一下字节
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务