题目大意:
给出一组点的二维坐标,求最多的在一条直线上的点的个数。
思路:
遍历点,计算经过每个点的斜率的最多的数量。注意重复的点。
最后取所有点的最大值。
不懂为什么只计算当前点和之后的点,结果和当前点和所有点的斜率是一样的。
代码:
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);
}
};