标签:
题目描述:
给出平面内的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 }
标签:
原文地址:http://www.cnblogs.com/li-xingtao/p/4269881.html