思路:利用哈希表记录两点的差分(dx,dy)的个数,在记录dx和dy的时候,将dx和dy同时除以他们两个的最大公约数,这样斜率相同的点的dx和dy就相同。利用p在记录相同点的个数,最后的结果就是相同点的个数加上斜率相同点的个数。
注意:这里用了两次循环,其实每次统计的是包含最外层那个点在内的(即点points[i]),直线上最多的点数。统计的相同的点也是统计和points[i]重合的点,当外循环中的i变化时,p的值重新初始化为1,重新开始统计。
/**
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
class Solution {
public:
int maxPoints(vector<Point>& points) {
int ans = 0;
for (int i = 0; i < points.size(); ++i)
{
map<pair<int, int>, int> m;
int p = 1;
for (int j = i + 1; j < points.size(); ++j)
{
if (points[i].x == points[j].x && (points[i].y == points[j].y)) { ++p; continue; }
int dx = points[j].x - points[i].x;
int dy = points[j].y - points[i].y;
int d = gcd(dx, dy);
++m[{dx / d, dy / d}];
}
ans = max(ans, p);
for (auto it = m.begin(); it != m.end(); ++it)
{
ans = max(ans, it->second+p);
}
}
return ans;
}
int gcd(int a, int b)
{
return (b == 0) ? a : gcd(b, a%b);
}
};