您的位置:首页 > 大数据 > 人工智能

leetcode 11.Container With Most Water

2016-09-24 18:51 387 查看
题意:给出1-n每个下标线的高度,问使用哪两条线和x轴做容器能放最多的水。

一种方法遍历高度,先从大到小排序高度,然后取出前两个放在x轴上,坐标为l和r,然后依次遍历剩下的线,因为高度一直减小,所以要求后面遍历的线使得r-l变大即可。

struct node
{
int x,height;
}nt;

bool cmp(node a,node b)
{
return a.height>b.height;
}

int maxArea(vector<int>& height)
{
vector<node> mt;
int len=height.size();
if(len<=1)
{
return 0;
}
for(int i=0;i<len;i++)
{
nt.x=i;
nt.height=height[i];
mt.push_back(nt);
}
sort(mt.begin(),mt.end(),cmp);
int l=min(mt[0].x,mt[1].x),r=max(mt[0].x,mt[1].x),ans=(r-l)*min(mt[0].height,mt[1].height);
for(int i=2;i<len;i++)
{
if(mt[i].x<l)
{
l=mt[i].x;
}
if(mt[i].x>r)
{
r=mt[i].x;
}
ans=max(ans,mt[i].height*(r-l));
}
return ans;
}

第二种方法,遍历宽度,初始l和r指向坐标轴的两端,然后找出l和r中比较短的那一条,像中间靠拢,因为l和r计算面积时,依据的是较短的那一根,向中间靠拢,r-l变小,想要让面积变大,必然要求线的高度变高。
int maxArea(vector<int>& height)
{
int len=height.size();
int l=0,r=len-1,ans=0;
while(l<r)
{
ans=max(ans,(r-l)*min(height[l],height[r]));
if(height[l]<height[r])
{
l++;
}else
{
r--;
}
}
return ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: