0
点赞
收藏
分享

微信扫一扫

149. 直线上最多的点数

杨小羊_ba17 2022-03-12 阅读 114
算法
  1. 直线上最多的点数
    给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。

示例 1:

输入:points = [[1,1],[2,2],[3,3]]
输出:3
示例 2:

输入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出:4

提示:

1 <= points.length <= 300
points[i].length == 2
-104 <= xi, yi <= 104
points 中的所有点 互不相同
通过次数55,378提交次数154,307

class Solution {
private:
    int gcd(int a,int b)
    {
        return b?gcd(b,a%b):a;
    }
public:
    int maxPoints(vector<vector<int>>& points) {
        int n=points.size();
        int ret=0;
        if(n<=2)
        {
            return n;
        }
        for(int i=0;i<n;i++)
        {
            unordered_map<int,int> mp;
            if(ret>=n-i||ret>n/2)
            {
                break;
            }
            for(int j=i+1;j<n;j++)
            {
                int x=points[i][0]-points[j][0];
                int y=points[i][1]-points[j][1];
                if(x==0)
                {
                    y=1;
                }
                else if(y==0)
                {
                    x=1;
                }
                else{
                    if(y<0)
                    {
                        x=-x;
                        y=-y;
                    }
                    int gcd_xy=gcd(abs(x),abs(y));
                    x=x/gcd_xy;
                    y=y/gcd_xy;
                }
                mp[y+x*20001]++;
            }
            int maxn=0;
            for(auto [_,num]:mp)
            {
                maxn=max(maxn,num+1);
            }
            ret=max(ret,maxn);
        }
        return ret;
    }
};
举报

相关推荐

0 条评论