【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;
}
};