力扣42.接雨水(简单易懂)

20 阅读1分钟

image.png

把图中蓝色的水部分也看成实心,我们只需要计算出总的面积再减去黑色部分即可

总的面积可以先一层一层的去计算,每一层定一个左右指针,找到当前大于等于当前高度的指针,然后当前层的面积就是 R - L + 1 然后再一层一层的计算即可,直到最高层

    public int trap(int[] height) {
        int heightSum = 0;
        int max_height = 0;
        for(int i = 0; i < height.length; i++) {
            heightSum += height[i];
            max_height = Math.max(max_height,height[i]);
        }
        int sum = 0;
        for(int h = 1; h <= max_height; h++) {
            int l = 0, r = height.length - 1;
            while(height[l] < h && l < r)
            l++;
            while(height[r] < h && r > l)
            r--;
            sum += r - l + 1;

        }
        return sum - heightSum;
    }
}