您的位置:首页 > 其它

二维平面上最多有多少个点在同一条直线上

2014-04-23 15:32 543 查看
思路一:两点确立一条直线,判断其余的点是否在直线上;时间复杂度o(n^3)


Submission Result: Time Limit Exceeded

int maxPoints(vector<Point> &points) {
vector<Point> vi=points;
int xi,yi;
int xj,yj;
unsigned int i,j,k;
int num=0;
int max=0;
int temp1,temp2,temp3,temp4,temp5;
if(vi.size()==0)
return 0;
else if(vi.size()>0&&vi.size()<=1)
return 1;
else if(vi.size()==2)
return 2;

for(i=0;i<vi.size();i++)
{
num=1;
xi=vi[i].x;
yi=vi[i].y;
for(j=i;j<vi.size();j++,num=2)
{
if(j==i)
continue;
xj=vi[j].x;
yj=vi[j].y;
num=2;
temp1=xj-xi;
temp2=yj-yi;
for(k=0;k<vi.size();k++)
{
if(k==i)
continue;
if(k==j)
continue;

//if(((yj-yi)*(vi[k].x-xi)/(xj-xi)+yi)==vi[k].y)
//temp1=(yj-yi)*(vi[k].x-xi);
if(temp1==0&&temp2==0)
{
if(xj==vi[k].x)
{num++;
continue;}
}
else{
temp3=temp2*vi[k].x+vi[i].y*vi[j].x-vi[j].y*vi[i].x;
temp4=temp1*vi[k].y;
if(temp3==temp4)
num++;
}

}
if(num>max)
max=num;

}
}

return max;

}


思路二:记下任意两点的斜率(不要是整形,float或double ),找出最多能有多少个点斜率相同,
注意处理一些特殊情况,如斜率为正无穷,或存在相同的点对

accept代码:
int maxPoints(vector<Point> &points)
{
int mx =1e10;
size_t i,j;
int xx,yy;
int sam=0;
int max_num=0;
map<double,int> m;
//m.clear();
if(points.size()==0)
return 0;
else if(points.size()==1)
return 1;
else if(points.size()==2)
return 2;

for(i=0;i<points.size();i++)//如果vector中有三个以上的点
{
m.clear();
sam=0;//用于记录有多少一样的点
for(j=i;j<points.size();j++)
{
double k;
xx=points[j].x-points[i].x;
yy=points[j].y-points[i].y;
if(xx==0&&yy==0)//两个点相同
{
sam++;
continue;
}
else if(xx==0)//两点确立的直线平行于y轴,它的斜率为正无穷,用mx表示
k=mx;
else
k=double(yy)/xx;//一般情况计算两点的斜率,注意区分k=double(yy/xx)

m[k]++;

}
if(m.size()==0)
{
if(sam>max_num)
max_num=sam;

continue;
}

map<double,int>::iterator it=m.begin();//遍历m
for(it;it!=m.end();it++)
{
if((*it).second+sam>max_num)
max_num=(*it).second+sam;
}

}

return max_num;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: