导航

动态规划 -- 接雨水

Posted on 2022-05-30 11:28  wuqiu  阅读(29)  评论(0编辑  收藏  举报

42.接雨水

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

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

class Solution {
public:
    int trap(vector<int>& height) {
        vector<int> left; vector<int> right;  int sum = 0 ;      
        //左边柱子高度为:max(左边柱子高度,左边柱子的左边柱子高度)
        for(int i = 0;i <= height.size()-1 ;i++){
            if(i == 0){
                left.push_back(0);
                continue;
            }
            int ll = max(height[i-1],left[i-1]);
            left.push_back(ll);
        }
        for(int i = height.size()-1;i >= 0 ;i--){
            if(i == height.size()-1){
                 right.push_back(0);
                 continue;
            }
            int rr = max(height[i+1],right[(height.size()-1)-(i+1)]);
            right.push_back(rr);
        }
        //每个位置的储水量等于  min(左,右)- 自身高度
        for(int i = 1;i<height.size()-1;i++){
            int hh = min(left[i],right[(height.size()-1)-i]) - height[i];
            if (hh > 0 )sum += hh; 
        }
        return sum;
    }
};

说明

对于每一个柱子来说,它的储水量可以表示为 MIN(左边柱子高度,右边柱子高度)- 柱子本身的高度
对于每一个柱子来说,它的左边柱子高度为 MAX(左边柱子的高度,左边柱子的左边柱子的高度)
对于每一个柱子来说,它的右边柱子高度为 MAX(右边柱子的高度,右边柱子的右边柱子的高度)