1. 题目
给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。
示例 1:
输入: [[1,1],[2,2],[3,3]]
输出: 3
解释:
^
|
| o
| o
| o
±------------>
0 1 2 3 4
2. 题解
2.1 解法1:
每次先选定一个点, 然后计算之后的点与其的斜率, 并将斜率为 key 存入哈希表中, 哈希表的 value存储点的个数, 斜率相同即两点在同一条直线上
注意
- 可能存在重复的点, 额外使用一个变量来存储
- 点数目小于 3时, 可以直接返回
class Solution {
public int maxPoints(int[][] points) {
if (points.length < 3) {
return points.length;
}
int ans = 0;
for (int i = 0; i < points.length; i++) {
Map<String, Integer> map = new HashMap<>();
// repeat用于存储重复点个数, max存储不同的点在同一条直线
int repeat = 0;
int max = 0;
for (int j = i + 1; j < points.length; j++) {
int x = points[i][0] - points[j][0];
int y = points[i][1] - points[j][1];
if (x == 0 && y == 0) {
repeat++;
continue;
}
int gcd = gcd(x, y);
x /= gcd;
y /= gcd;
String key = x + "@" + y;
map.put(key, map.getOrDefault(key, 0) + 1);
max = Math.max(max, map.get(key));
}
// 最终结果 加1 是加上该点本身, 还有重复点以及不同的点
ans = Math.max(ans, max + repeat + 1);
}
return ans;
}
/**
* 求最大公约数, 该快速解法可以记忆下来
*
* @param a
* @param b
* @return 最大公约数
*/
public int gcd(int a, int b) {
while (b != 0) {
int temp = a % b;
a = b;
b = temp;
}
return a;
}
}
参考: 详细通俗的思路分析,多解法