Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
给出若干个点,求出最多的点使得这些点共线,输出点数。对于每一个点,视当前点为起点,到各个点的直线斜率相等的话就是共线,用map记录共线的点的数目,要注意点相同时和两个点连成的直线斜率不存在时这两种情况。最后比较得到最大数目即可。
代码:
/**
* 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 n=points.size();
if(n<=2) return n;
int res=0;
for(int i=0;i<n;i++)
{
map<pair<int,int>,int>um;
int x=points[i].x,y=points[i].y;
int same=0,ver=0;
int cur_max=0;
for(int j=i+1;j<n;j++)
{
int a=points[j].x-x,b=points[j].y-y;
if(a==0&&b==0)
{
++same;
}
else if(a==0)
{
++ver;
cur_max=max(ver,cur_max);
}
else
{
int d=gcd(b,a);
//cout<<d<<endl;
a/=d;
b/=d;
cur_max=max(cur_max,++um[make_pair(a, b)]);
}
}
res=max(res,cur_max+same+1);
}
return res;
}
private:
int gcd(int n,int m)
{
while(n%m!=0)
{
int tmp=n;
n=m;
m=tmp%m;
}
return m;
}
};