我的第一想法是找到数组的最大值,然后分左右两边求能装的水量,再加起来。
class Solution {
public:
int trap(vector<int>& height)
{
if(!height.size()||height.size()==1)
return 0;
int i,j,max=0,index,width;
for(i=0;i<height.size();i++)
{
if(height[i]>max)
{
max=height[i];
index=i;
}
}
i=0;
int start,end;
start=i;
int temp,sum;
temp=0;sum=0;
for(j=i+1;j<index;j++)
{
if(height[j]>height[start])
{
end=j;
width=end-start-1<0?0:end-start-1;
sum=sum+width*height[start]-temp;
temp=0;
start=end;
}
else
temp=temp+height[j];
}
end=index;
width=end-start-1<0?0:end-start-1;
sum=sum+width*height[start]-temp;
i=height.size()-1;
start=i;
temp=0;
for(j=i-1;j>index;j--)
{
if(height[j]>height[start])
{
end=j;
width=start-end-1<0?0:start-end-1;
sum=sum+width*height[start]-temp;
temp=0;
start=end;
}
else
temp=temp+height[j];
}
end=index;
width=start-end-1<0?0:start-end-1;
sum=sum+width*height[start]-temp;
return sum;
}
};
然后看别人的想法采用l和r两个指针,维护装水两边的位置。
当l处高度低时,右移l,同是加上l处与右移后位置高度差(因为这里都能装水啊),直到再遇到同样高或者更高的位置。然后进行下一轮判断。
同样,当r处高度低时,左移r,同是加上r处与左移后位置高度差,直到再遇到同样高或者更高的位置。
最后直到l和r相遇,结束。
class Solution {
public:
int trap(vector<int>& height)
{
int l=0,
r=height.size()-1,
lheight=height[l],
rheight=height[r],
water=0;
while(l<r)
{
if(lheight<rheight)
{
l++;
if(height[l]<lheight)
water+=lheight-height[l];
else
lheight=height[l];
}
else
{
r--;
if(height[r]<rheight)
water+=rheight-height[r];
else
rheight=height[r];
}
}
return water;
}
};