Loading

42. Trapping Rain Water

给定 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


class Solution {
public:
    //如果单向查找,我们最终会停在最高点上。最高点的右边无法计算
    //所以我们要双向计算,同时朝最高点行走。
    //下面这个解法同时进行。。。
    int trap(vector<int> A) {
        int left=0; int right=A.size()-1;
        int res=0;
        int maxleft=0, maxright=0;
        while(left<=right)
        {
            if(A[left]<=A[right])//left<=right,水最终会从左边流走,所以看left能不能在右边找到高墙
            {
                if(A[left]>=maxleft) 
                    maxleft=A[left];
                else 
                    res+=maxleft-A[left];
                left++;
            }
            else{
                if(A[right]>=maxright) 
                    maxright= A[right];
                else res+=maxright-A[right];
                right--;
            }
        }
        return res;
    }
};

 

posted @ 2018-09-29 17:25  老鼠阿尔吉侬  阅读(123)  评论(0)    收藏  举报