给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。
示例 1:
输入: [[1,1],[2,2],[3,3]]
输出: 3
解释:
^
|
| o
| o
| o
+------------->
0 1 2 3 4
示例 2:
输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出: 4
解释:
^
|
| o
| o o
| o
| o o
+------------------->
0 1 2 3 4 5 6
思路:遍历points数组
每次遍历时,求其他所有点到当前遍历元素的斜率(为解决浮点数的精度问题,改为求最大公约数),若斜率相同,则在同一条直线上,将结果存到hashMap中
同一条直线是x轴或y轴的平行线的情况需特殊处理
Java代码:
class Solution {
public int maxPoints(Point[] points) {
int len = points.length, maxpoint = 0;
if (2 > len)
return len;
for (int i = 0; i < len; i++) {
Map<String, Integer> map = new HashMap<>();
int line = 1, col = 1, same = 0;
for (int j = 0; j < len; j++) {
if (j == i)
continue;
Point m = points[i], n = points[j];
if (n.x == m.x && n.y == m.y) {
same++;
} else if (n.x == m.x) {
col++;
} else if (n.y == m.y) {
line++;
} else {
int x = m.x - n.x, y = m.y - n.y;
// 求最大公约数,化简分数斜率
int gcd = gcd(x, y);
String slope = x / gcd + "/" + y / gcd;
map.put(slope, (null == map.get(slope) ? 1 : map.get(slope)) + 1);
}
}
for (String slope : map.keySet()) {
maxpoint = Math.max(maxpoint, map.get(slope) + same);
}
maxpoint = Math.max(maxpoint, line + same);
maxpoint = Math.max(maxpoint, col + same);
}
return maxpoint;
}
// 求最大公约数,用于化简分数斜率
private int gcd(int x, int y) {
if (x < y)
return gcd(y, x);
int tmp;
while ((tmp = x % y) != 0) {
x = y;
y = tmp;
}
return y;
}
}