目录
方法1:预处理最值
int trap(vector<int>& height) {
int n=height.size();
//预处理得到柱子左右的最大值
vector<int>left(n);
vector<int>right(n);
left[0]=height[0];
for(int i=1;i<n;i++){
left[i]=max(height[i],left[i-1]);
}
right[n-1]=height[n-1];
for(int i=n-2;i>=0;i--){
right[i]=max(right[i+1],height[i]);
}
int res=0;
for(int i=1;i<=n-2;i++){
if(left[i-1]<=height[i]||right[i+1]<=height[i])continue;
res+=min(left[i-1],right[i+1])-height[i];
}
return res;
}
方法2:面积差值
int trap(vector<int>& height) {
int sum=0,maxHeight=0;
int n=height.size();
for(int i=0;i<n;i++){
sum+=height[i];
maxHeight=max(maxHeight,height[i]);
}
int full=maxHeight*n;
int lsum=0,lmax=0;
for(int i=0;i<n;i++){
lmax=max(lmax,height[i]);
lsum+=lmax;
}
int rsum=0,rmax=0;
for(int i=n-1;i>=0;i--){
rmax=max(height[i],rmax);
rsum+=rmax;
}
return lsum-full-sum+rsum;
}