思路:
通过“点斜式”确定直线,计数经过某个点的直线,哪条直线上的点最多。用HashMap去记录,key是斜率,遍历平面上的其他点,相同的key意味着在同一条直线上。
public int maxPoints(int[][] points){
if (points.length<3) {
return points.length;
}
int res = 0;
// 遍历每个点
for (int i=0;i<points.length;i++) {
int duplicate = 0;
int max = 0; // 保存经过当前点的直线中,最多的点
HashMap<String, Integer> map = new HashMap<>();
// 键String是斜率, 值是max,这个斜率最多的点数
for (int j=i+1;j<points.length;j++) {
//求出斜率分子分母
int x = points[j][0] - points[i][0]; // 横坐标相减
int y = points[j][1] - points[i][1]; // 纵坐标相减
if (x==0 && y==0) { // 即同一个点
duplicate ++;
continue;
}
//进行约分
int gcd = gcd(x, y); // 最大公因子
x = x/gcd;
y = y/gcd;
String key = x + "@" + y;
map.put(key, map.getOrDefault(key, 0)+1);
max = Math.max(max, map.get(key));
}
res = Math.max(res, max+duplicate+1);
}
return res;
}
private int gcd(int a, int b) {
// 求最大公因子就是不断取余数
while (b!=0) {
int temp = a%b;
a = b;
b = temp;
}
return a;
}