【LeetCode 42】接雨水

题目链接

【题解】

考虑每个位置它最后能接多少单位的水。 显然就是这个min(位置左边最高的位置,位置右边最高的位置)-当前这个位置的高度。 这就是这个位置最后水上涨的高度。 两个边界注意是不会储水的(都会掉到左边或者右边的边界外去). 每个位置左边最高的位置可以用DP很容易搞出来

【代码】

class Solution {
public:
    const int N = 1e5;
    int trap(vector<int>& height) {
        int maleft[N+10],maright[N+10];
        memset(maleft,0,sizeof(maleft));memset(maright,0,sizeof(maright));
        int n = height.size();
        for (int i = 0;i < n;i++){
            if (i>0) maleft[i] = maleft[i-1];
            maleft[i] = max(maleft[i],height[i]);
        }
        for (int i = n-1;i>=0;i--){
            if (i<n-1) maright[i] = maright[i+1];
            maright[i] = max(maright[i],height[i]);
        }
        int ans = 0;
        for (int i = 1;i < n-1;i++){
            //cout<<maleft[i]<<" "<<maright[i]<<endl;
            ans = ans + min(maright[i],maleft[i])-height[i];
        }
        return ans;
    }
};
posted @ 2019-11-15 09:26  AWCXV  阅读(112)  评论(0编辑  收藏  举报