- 直线上最多的点数
给你一个数组 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;
}
};