取一条左边的较高边,再往右找一条>=左边的边,或者左边最高的边
class Solution {
public:
int trap(vector<int>& height) {
int n=height.size();
int i=0,j,left,right;
int ans=0;
while(i<n&&height[i]==0)
{
i++;
}
left=i,right=i;
while(left<n)
{
i=left+1;
while(i>0&&i<n&&height[i]>=height[i-1])
{
left=i;
i++;
}
if(i>=n)
break;
right=i;
i++;
while(i>0&&i<n)
{
if(height[i]>=height[right])
right=i;
if(height[i]>=height[left])
break;
i++;
}
if(height[left]>=height[right])
{
for(j=left;j<=right;j++)
{
if(height[j]<height[right])
ans+=height[right]-height[j];
}
}
else
{
for(j=left;j<right;j++)
{
if(height[j]<height[left])
ans+=height[left]-height[j];
}
}
left=right;
}
return ans;
}
};
class Solution {
public:
int trap(vector<int>& height) {
int n=height.size();
int left=0,right=n-1;
int ans=0;
while(left<right)
{
int minh=min(height[left],height[right]);
if(minh==height[left])
{
while(++left<right&&height[left]<minh)
ans+=minh-height[left];
}
else
{
while(--right>left&&height[right]<minh)
ans+=minh-height[right];
}
}
return ans;
}
};