您的位置:首页 > 其它

解题报告1 Max Points on a Line

2016-09-18 22:30 281 查看
题目:

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

方法:

找到两个不重合的顶点,然后统计这两个顶点确定的直线上点的数目。

遍历所有的起点和终点即可。

1.确定起点

2.统计平面上多少顶点与起点重合

3.找到一个与起点不重合的顶点作为终点,统计起点与终点确定的直线上所有的与起点不重合的顶点

(注意可以和终点重合,用三点共线即可)

4.将步骤2中顶点数目与步骤3中数目相加即可

代码中

1.for( intj
= i+1; j<size; j++)的解释:

对于顶点points[i],points[j]所确定的直线与points[j],points[i]所确定的直线相同

j=i+1可以避免这种重复计算。

2.判断与起点相同的点的数目与顶点总数目的原因 ,如果所有的点都和起点相同?

或者只有一个顶点和起点不相同,那么并没有三点共线的问题。参考博客里好像没考虑这个问题也对了?

参考:http://www.cnblogs.com/bill-liu/p/5027828.html

代码:

/**
* Definition for a point.
* struct Point {
*     int x;
*     int y;
*     Point() : x(0), y(0) {}
*     Point(int a, int b) : x(a), y(b) {}
* };
*/
class Solution {
public:
int maxPoints(vector<Point> &points) {

int size = points.size();

if( size<=2 ) return size ;

int maxinum = 0 ;
int num = 0 ;

//(points(i),points(j)) 与 (points(j),points(i)) 确定的是一条直线,避免重复统计
//因此j从i+1开始遍历
for( int i = 0; i<size; i++ )
{
int x1,y1 ;
x1 = points[i].x ;
y1 = points[i].y ;

int sameNum = 1 ;
for(int j=0; j<size; j++ )//统计与起点相同的点的数目+原起点1
{
int x2 = points[j].x , y2 = points[j].y ;
if( x2==x1 && y2==y1 && j!=i )
sameNum++;
}
if( sameNum!=size )
{
//j=i+1,避免重复计算
for( int j = i+1; j<size; j++)//选取一个与起点不相同的点作为终点,查找这条直线上点数
{
int x2,y2 ;
x2 = points[j].x ; y2 = points[j].y ;

num = 1 ;//每次遍历一条直线上所有点数后num需要重置,因为points[j]与起点不同所以num=1
if( x2!=x1 || y2!=y1 )//选取一个与起点不相同的点作为终点
{
for( int k=0;  k<size; k++ )//统计这条直线上点数
{
int x3 = points[k].x , y3 = points[k].y ;
if( (x3!=x1 || y3!=y1)&&k!=j )//第三个点不能起点重合,终点不需要统计,但重合可以
{
if(  (y1-y2)*(x1-x3) == (y1-y3)*(x1-x2)  )//如果三点共线
num++;
}
}
num = num + sameNum ;//如果sameNum==size-1其实只有两个点

}//统计两点确定直线上所有点数

if( num > maxinum )
maxinum = num ;
}

}
else
maxinum = sameNum;//全部与起点相同
}

return maxinum ;

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