0%

max-points-on-a-line

题目描述

给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

题解

对于每一个定点,向后面遍历每一个点,就得到一条直线,找在这条直线上最多的点数。

斜率如果是小数的话就会存在精度问题,不能做key,因此对分数进行约分,保存为特殊字符串:”分子@分母”。约分的话需要找出最大公约数gcd,计算gcd需要使用辗转相除法。

还要考虑重复的点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
inline int gcd(int a, int b)
{
while (b != 0) {
int temp = a % b;
a = b;
b = temp;
}
return a;
}
int maxPoints(vector<vector<int>>& points) {
int number = points.size();
if (number < 3)return number;
int res = 0;
for (int i = 0; i < number - 1; i++)
{
int dup = 0;
int Max = 0;//保存经过当前点的直线中,最多的点
unordered_map<string, int>m;
for (int j = i + 1; j < number; j++)
{
int x = points[i][0] - points[j][0];
int y = points[i][1] - points[j][1];
if (x == 0 && y == 0)
{
dup++;
continue;
}
if (x < 0) { x = -x; y = -y; }
int i = gcd(x, y);
x /= i; y /= i;
string s = to_string(x);
s = s + "@" + to_string(y);
if (!m.count(s))m[s] = 1;
else m[s]++;
if (Max < m[s])
Max = m[s];
}
res = max(res, Max + dup + 1);
}
return res;
}

怎么办啊 我太菜了。