Leetcode Max Points on a Line

本文探讨了给定2D平面上的多个点时如何找出共线点的最大数量。通过使用哈希表记录每条直线上的点数,并利用数学方法简化直线方程的表示,最终实现了高效算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


暴力破解,通过记录hash方法来进行记录中间结果,代码如下:

/**
 * 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) {
        if(points.size()<2)
            return points.size();
        
        int result=0;
        for(int i=0;i<points.size()-1;i++)
        {
            int vect=1,duplicate=0,local=1;
            unordered_map<double,int> map;
            for(int j=i+1;j<points.size();j++)
            {
                if(points[i].x == points[j].x)
                {
                    if(points[i].y == points[j].y)
                        duplicate++;
                    else
                        vect++;
                }
                else
                {
                    double slop = (points[j].y-points[i].y)*1.0/(points[j].x-points[i].x);
                    map[slop]==0?map[slop]=2:map[slop]++;
                    local = max(local,map[slop]);
                }
            }
            local = max(local+duplicate,vect+duplicate);
            result = max(local,result);
        }
        return result;
    }
};

结果发现无法通过,应该是求slop的时候无法处理,导致虽然不在同一直线上也被算进去,需要找其他的方法。通过学习其他人的代码,发现如果点在同一条直线上y=ax+b,那么a=(y2-y1)/(x2-x1).,记录a的话会出错,那么我们可以记录(y2-y1)以及(x2-x1)这个数字对,将他们去除公约数后的值w,一条线上的两个点之间求出的w必然相等。

代码如下:

/**
 * 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) {
        if(points.size()<2)
            return points.size();
        
        int result=0;
        for(int i=0;i<points.size()-1;i++)
        {
            int vect=0,duplicate=1,local=0;
            map<pair<int,int>,int> map;
            for(int j=i+1;j<points.size();j++)
            {
                if(points[i].x == points[j].x)
                {
                    if(points[i].y == points[j].y)
                        duplicate++;
                    else
                        vect++;
                }
                else
                {
                    int a = (points[j].y-points[i].y);
                    int b = (points[j].x-points[i].x);
                    int gcd = GCD(a,b);
                    
                    a /=gcd;b/=gcd;
                    map[make_pair(a,b)]++;
                    local = max(local,map[make_pair(a,b)]);
                }
            }
            local = max(local+duplicate,vect+duplicate);
            result = max(local,result);
        }
        return result;
    }
    
     int GCD(int a, int b) {
        
        if(b==0) return a;
        else return GCD(b, a%b);
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值