力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
先算出每个位置的面积,然后把每个位置的面积相加就得到了最终可以接多少雨水!
每个位置的面积等于(该位置左边包括自己最大的高度)与(该位置右边包括自己最大的高度)中最小的那个数,然后减去当前位置的高度,就是当前位置可以存放的雨水。
首先定义两个数组left_Max,right_Max来去计算每个位置的雨水可以到达的最大高度,然后遍历height用每个位置雨水达到的最大高度减去当前位置的高度,相加之后返回结果即可。
细节:需要初始化 left_Max[0]=height[0] 如果左边没有元素的情况下直接取自己即可
需要初始化 right_Max[n-1]=height[n-1] 如果右边没有元素的情况下直接取自己即可
- class Solution
- {
- // 动态规划
- // 每个位置的面积等于(该位置左边包括自己最大的高度)与(该位置右边包括自己最大的高度)中最小的那个数
- // 减去当前位置的高度,就是当前位置可以存放的雨水
- // 首先定义两个数组left_Max,right_Max来去计算每个位置的雨水可以到达的最大高度
- // 然后遍历height用每个位置雨水达到的最大高度减去当前位置的高度
- // 相加之后返回结果即可
-
- // 细节:
- // 需要初始化 left_Max[0]=height[0] 如果左边没有元素的情况下直接取自己即可
- // 需要初始化 right_Max[n-1]=height[n-1] 如果右边没有元素的情况下直接取自己即可
- public:
- int trap(vector<int>& height)
- {
- int n=height.size();
- // 创建数组
- vector<int> left_Max(n),right_Max(n);
- left_Max[0]=height[0];
- right_Max[n-1]=height[n-1];
- // 给两个数组赋值
- for(int i=1;i
max(left_Max[i-1],height[i]); - for(int i=n-2;i>=0;i--) right_Max[i]=max(right_Max[i+1],height[i]);
-
- // 遍历求和
- int sum=0;
- for(int i=0;i
- {
- sum+=min(left_Max[i],right_Max[i])-height[i];
- }
- return sum;
- }
- };