Max Points on a Line

题目描述:

    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);
}
};

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值