1. 程式人生 > >給定平面上的n個點,求最多有多少個點共線

給定平面上的n個點,求最多有多少個點共線

給定一個二維平面上的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; } };