题目:
题解:
可以把每个宽度看作一个桶,每个桶能接的水等于这个桶左右两个方向最高桶的最小高度再减去这个桶本身的高度。把每个桶能接的水相加即可。
难点在于如何快速找到当前桶的左右两个方向的最高桶的高度,可以先遍历一遍数组找出前缀最大值,和后缀最大值,前位置左右最高桶的高度就为当前位置的前缀最大值和后缀最大值。
int trap(vector<int>& height) {
int arr[height.size()];
int brr[height.size()];
for(int i=0;i<height.size();i++){
if(!i){
arr[i]=height[i];
}else{
arr[i]=max(arr[i-1],height[i]);
}
}
for(int i=height.size()-1;i>=0;i--){
if(i==height.size()-1){
brr[i]=height[i];
}else{
brr[i]=max(height[i],brr[i+1]);
}
}
int ans=0;
for(int i=0;i<height.size();i++){
ans+=min(arr[i],brr[i])-height[i];
}
return ans;
}