题目链接
力扣(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<n;i++) left_Max[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<n;i++)
{
sum+=min(left_Max[i],right_Max[i])-height[i];
}
return sum;
}
};