給定平面上的n個點,求最多有多少個點共線
阿新 • • 發佈:2019-01-01
給定一個二維平面上的n個點,找出同一條直線上的最大點數。
解法:
窮舉,注意斜率不適用float作為鍵,精度損失。
class Solution {
public:
int gcd(int x,int y) { //求最大公約數
if (y == 0)
return x;
else
return gcd(y, x%y);
}
int maxPoints(vector<Point> &points) {
if(points.empty())
return 0;
else if(points.size() <= 2)
return points.size();
sort(points.begin(), points.end(), [](Point a, Point b){return a.x<b.x;});
long long ans = 0;
int n = points.size();
for(int i = 0; i < n; i++){
map<pair<int, int>, long long> m;
long long cover = 0, vertical = 0, maxk = 0;
for(int j = i+1; j<n; j++){
int dx = points[i].x - points[j].x;
int dy = points[i].y - points[j].y;
if(dx == 0 && dy == 0) //兩點重合
++cover;
else if(dx == 0) //兩點橫座標相等(不重合)
maxk = max(maxk, ++vertical);
else{
int g = gcd(dx, dy);
dx/=g, dy/= g;
// 計算最大公約數:歐幾里得演算法
// 斜率不適用float作為鍵,精度損失,使用除以最大公約數後的pair作為鍵
maxk = max(maxk, ++m[make_pair(dx, dy)]);
}
}
ans = max(ans, maxk + cover +1);
}
return ans;
}
};