首页 > 代码库 > Max Points on a Line 149

Max Points on a Line 149

题目描述:

给出平面内的n个点,求最多有多少各点在同一条直线上


 

题目分析:

同一条直线上的点,任意两个点之间对应相同的斜率

这样我们固定一个点s(我们称为起始点),求出其他所有点与起始点构成向量的斜率

那么这些斜率中相同的,他们对应的点与起始点在同一条直线上

为了,能快速找到重复次数最多的斜率,我们对斜率排序,这样可以在总时间nlogn时间内找出重复次数最多的点

然后,替换起始点重复上面操作,总的时间复杂度是n*nlogn

 

注意:

在计算斜率时,对于斜率无穷大的要拿出来特殊考虑(所有斜率无穷大的点,与起始点都在同一条直线上)

对于与起始点重合的点也要特殊考虑,这种点是一定与起始点在同一条直线上的

比较斜率时候相等时,不要用‘==’ ,double类型比较相等时可以两个数相减,结果如果小于一个很小的数,认为两个数相等

 


 

代码:

 1 bool equal(double x,double y){ 2     if(fabs(x-y)<10e-6)return true; 3     return false; 4 } 5  6 int maxPoints(vector<Point> &points){ 7     int len=points.size(); 8     if(len<=2)return len; 9 10     double slope[len];/// 存储斜率11     int ma=0;12     for(int i=0;i<len-1;i++){13     int vertical =1;///与i点垂直方向上的点数,因为这个时候dx==0不能计算斜率,要单独计算14     int samePoint=1;///与i点在同一位置上的点的个数15     int cnt=0;16     for(int j=i+1;j<len;j++){17         int dx=points[i].x-points[j].x;18         int dy=points[i].y-points[j].y;19         if(dx==0){20         if(dy==0) samePoint++;21         else vertical++;22         }23         else slope[cnt++]=(double)dy/dx;24     }25 26     ma=max(ma,vertical+samePoint-1);///减1,因为在vertical和samePoint中都包含i点27     if(cnt==0)return ma;28 29     sort(slope,slope+cnt);30     int repCnt=1+samePoint;31     for(int j=1;j<cnt;j++){32         if(equal(slope[j],slope[j-1]))repCnt++;33         else {34         ma=max(ma,repCnt);35         repCnt=1+samePoint;36         }37     }38     if(repCnt>ma)ma=repCnt;39     }40     return ma;41 }

 

 

Max Points on a Line 149