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(右边柱子的高度,右边柱子的右边柱子的高度)