leetcode 42

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

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:

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

Here is my idea: instead of calculating area by height*width, we can think it in a cumulative way. In other words, sum water amount of each bin(width=1).
Search from left to right and maintain a max height of left and right separately, which is like a one-side wall of partial container. Fix the higher one and flow water from the lower part. For example, if current height of left is lower, we fill water in the left bin. Until left meets right, we filled the whole container.

public int trap(int[] heights) {
        int left=0;
        int right=heights.length-1;
        int maxLeft=0;
        int maxRight=0;
        int res=0;
        while(left<right) {
            if(heights[left]<heights[right]) {
                if(heights[left]>maxLeft) {
                    maxLeft=heights[left];
                }else {
                    res+=maxLeft-heights[left];
                }
                left++;
            }else {
                if(heights[right]>maxRight) {
                    maxRight=heights[right];
                }else {
                    res+=maxRight-heights[right];
                }
                right--;
            }
        }
        return res;
    }

猜你喜欢

转载自blog.csdn.net/louiey/article/details/81128911