给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。
思路:两点可以确定一条直线,那么选择固定一个点,求其他点与固定点的斜率,如果斜率相同,那么斜率相同的点在同一条直线上。
注意点:
1.保存斜率可以使用哈希表进行;
2.测试数据中精度要求很高,使用Double进行计算会出现错误,可以选择使用BigDecimal进行高精度计算。
AC代码:
public int maxPoints(Point[] points) {
int len = points.length;
if(len < 3) return len;
int maxNum = 0;
for(int i = 0; i < len; i++){
int repeat = 1;
Map<String, Integer> map = new HashMap<>();
for(int j = 0; j < len; j++){
if(i == j) continue;
if(points[i].x == points[j].x && points[i].y == points[j].y) {
repeat++;
continue;
}
String index = "";
if(points[i].x == points[j].x) {
index = "INF";
}
else {
String a = String.valueOf(points[i].y - points[j].y);
String b = String.valueOf(points[j].x - points[i].x);
index = new BigDecimal(a).divide(new BigDecimal(b), 20, RoundingMode.HALF_UP).toString();
//index = Double.toString(k);
}
int count = 1;
if(map.get(index) != null) {
count = map.get(index) + 1;
}
map.put(index,count);
}
for(Map.Entry<String, Integer> entry : map.entrySet()){
if(entry.getValue() + repeat > maxNum) maxNum = entry.getValue() + repeat;
}
maxNum = maxNum > repeat ? maxNum : repeat;
}
return maxNum;
}