【LeetCode 149.】 Max Points on a Line

题目大意:

给出一组点的二维坐标,求最多的在一条直线上的点的个数。

思路:

遍历点,计算经过每个点的斜率的最多的数量。注意重复的点。
最后取所有点的最大值。
不懂为什么只计算当前点和之后的点,结果和当前点和所有点的斜率是一样的。

代码:

class Solution {
public:
    int maxPoints(vector<vector<int>>& points) {
        map<pair<int, int>, int> mp;
        int ans = 0;
        
        for (int i=0; i<points.size(); ++i) {
            int px1 = points[i][0];
            int py1 = points[i][1];
            int dup = 1;
            int cnt = 0;
            mp.clear();
            for (int j=0; j<points.size(); ++j) {
                if (j == i) continue;
                int px2 = points[j][0];
                int py2 = points[j][1];
                if (px1 == px2 && py1 == py2) {
                    dup++;
                    continue;
                }else {
                    cnt = max(cnt, ++mp[get_slope(px1, py1, px2, py2)]);
                }
            }
            ans = max(ans, cnt + dup);
        }
        return ans;
    }
    
    pair<int, int> get_slope(int x1, int y1, int x2, int y2) {
        int dx = x2 - x1;
        int dy = y2 - y1;
        if (dx == 0) return {0, y1};
        if (dy == 0) return {x1, 0};
        int d = gcd(dx, dy);
        dy /= d, dx /= d;
        return {dy, dx};
    }
    
    int gcd(int m, int n) {
        return n == 0 ? m : gcd(n, m%n);
    }
};

猜你喜欢

转载自blog.csdn.net/iCode_girl/article/details/94655403