给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
出处
就是寻找“凹”形区间,找使得左右两端点为最大的两个值的最长区间。这里我分了两种情况,右边大于等于左边和右边小于左边,分别是在if和else if中。
class Solution {
public:
int trap(vector<int>& height) {
int n=height.size();
if(n==1)
return 0;
int left=0,right;
int sum=0;
int maxl,maxr,rindex;
while(left<n-1) {
right=left+1;
if(height[right]>height[left]){
left++;
continue;//此时left不是合法左边
}
maxl=height[left];
maxr=height[right];
rindex=0;
while (right<n&&height[right]<height[left]){
if(height[right]>maxr)
{
maxr=height[right];
rindex=right;
}
right++;
}
if(right-left>1&&right<n){//右边大于等于左边
int t=height[left];
for(int i=left+1; i<right; i++)
sum+=(t-height[i]);
left=right;
}
else if(rindex!=0){//右边小于左边
int t=height[rindex];
for(int i=left+1; i<rindex; i++)
sum+=(t-height[i]);
left=rindex;
}
else
left++;
}
return sum;
}
};