本题目是给定一个数组,数组每个位置代表高度,求最多能接多少的雨水,详情见图,图中蓝色部分即为接的雨水。这道题实现起来并不复杂,但是思路有点难想。首先从第一个位置开始,向后寻找第一个高度大于等于它的位置,如果找到了,那么第一个水池就是这两部分之间,水面高度最大就是开始位置的高度,用这个最大高度依次减去水池中每个位置的高度就是这个水池能接的水。第二种情况,它之后只有比它低的位置,那么就从它之后这些位置中选择一个最大的高度的位置,如果有多个位置最高,选择最后一个最高的,然后从这个位置开始到我们找到的位置就是水池,水池的水面高度就是刚才找出的最大高度,这个最大高度是比我们开始的位置要低的,求水池接的水量和第一种方法相同。
class Solution {
public:
int trap(vector<int>& height) {
int sz=height.size();
int ans=0,nowmax,pos;
for(int i=0;i<sz;i++)
{
nowmax=-1;
if(i==sz-1) break;
if(height[i]<=height[i+1]) continue;
for(int j=i+1;j<sz;j++)
{
if(nowmax<=height[j])
{
nowmax=height[j];
pos=j;
}
if(nowmax>=height[i]) break;
}
int high=min(height[i],nowmax);
for(int j=i+1;j<pos;j++)
{
ans+=high-height[j];
}
cout<<i<<' '<<pos<<' '<<ans<<endl;
i=pos-1;
}
return ans;
}
};