题目描述:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
题目大意:一个平面 求出在一条直线上的点的最大数量。
难点:
1.对于垂直x轴和y轴的直线 直接累加取最大即可 但是对于有斜率的直线 ,关键点在于对斜率的处理,这里采用了 利用gcd映射的方法。
2.对于重合点的处理.
AC代码:
/**
* 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 max2(int a , int b ){
return a>b?a:b;
}
int max3( int a , int b , int c ){
return max2(max2(a,b),c);
}
int GCD(int a, int b) {
if(b==0)
return a;
else
return GCD(b, a%b);
}
int maxPoints(vector<Point>& points) {
int n = points.size();
//两点构成一条直线
if( n <= 2 )
return n;
int maxx = 0;
int mayy = 0;
int mazz = 0;
unordered_map<int,int> umap_x; //x轴的点的数量
unordered_map<int,int> umap_y; //y轴的点的数量
map<pair<int,int>,int> umap_z; //有斜率的直线的映射 如果两个点在一条直线上 分数形式的斜率一定是相同的 用gcd求最大公约数
int count = 0;
int a,b;
for( int i = 0 ; i < n - 1 ; i ++ , count = 0)
{
umap_z.clear();
for( int j = i+1 ; j < n ; j ++ )
{
//同一个点
if( points[i].x == points[j].x && points[i].y == points[j].y )
{
count ++;
}
//不是同一个点 并且两点连成的直线不与x和y轴垂直
else if( points[i].x != points[j].x && points[i].y != points[j].y )
{
//斜率
b = points[j].x-points[i].x;
a = points[j].y-points[i].y;
int gcd = GCD(a,b);
a /= gcd;
b /= gcd;
umap_z[make_pair(a, b)] ++;
}
}
for( map<pair<int,int>,int>::iterator iter = umap_z.begin() ; iter != umap_z.end() ; iter ++ )
mazz = max2(mazz,iter->second+count+1);
}
for( int i = 0 ; i < n ; i ++ ){
//求垂直x轴的直线的点
umap_x[points[i].x] ++;
//求垂直y轴的直线的点
umap_y[points[i].y] ++;
}
for( unordered_map<int,int>::iterator iter = umap_x.begin() ; iter != umap_x.end() ; iter ++ )
maxx = max2(maxx,iter->second);
for( unordered_map<int,int>::iterator iter = umap_y.begin() ; iter != umap_y.end() ; iter ++ )
mayy = max2(mayy,iter->second);
//返回垂直x y轴和有斜率的点的最大值
return max3(maxx,mayy,mazz);
}
};