题目描述:
给出一系列二维直角坐标系中的点(xi, yi),编写程序求出最多有多少个点在同一条直线上。
例如输入[[1, 1], [2, 2], [3, 3]],则输出3;
输入[[1, 1], [2, 2], [3, 3], [4, 5]],则输出3。等等。
点的结构体struct Point已经给出。
解题思路:
C++代码:
#include <bits/stdc++.h>
using namespace std;
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);
}
};
int main()
{
Point p[8] = {Point(1, 1), Point(2, 2), Point(3, 3), Point(4, 4), Point(5, 5), Point(6, 6), Point(7, 7), Point(5, 2)};
vector<Point> a(p, p + 8);
Solution sol = Solution();
printf("%d", sol.maxPoints(a));
return 0;
}