思路:看过英雄哥的解题思路,知道要用前缀和后缀最值,定义俩数组,数组每个元素代表到当前这个元素为止,往左或往右最大的值,判断能接多少水的时候忽略两头
C
void prefix(int *height, int heightSize, int *left_max){
for(int i=0;i<heightSize;i++){
if(i==0){
left_max[i]=height[i];
}else{
left_max[i]=fmax(height[i], left_max[i-1]);
}
}
}
void suffix(int *height, int heightSize, int *right_max){
for(int i=heightSize-1;i>=0;i--){
if(i==heightSize-1){
right_max[i]=height[i];
}else{
right_max[i]=fmax(height[i], right_max[i+1]);
}
}
}
int trap(int* height, int heightSize) {
int right_max[heightSize];
int left_max[heightSize];
int sum=0;
suffix(height, heightSize, right_max);
prefix(height, heightSize, left_max);
for(int i=1;i<heightSize-1;i++){
int left = left_max[i-1];
int right = right_max[i+1];
if(fmin(right,left)>height[i]){
sum += fmin(left,right)-height[i];
}
}
return sum;
}