import java.util.*;
public class Solution {
public int maxPoints(Point[] points) {
int res=0;
for (int i=0;i<points.length;i++){
Point a = points[i];
int dup=1,vtl=0;
Map<Float,Integer> map =new HashMap<>();
for (int j=0;j<points.length;j++){
if (i==j) continue;
Point b = points[j];
if (a.x==b.x){
if (a.y==b.y){
dup++;
}else{
vtl++;
}
}else{
float k=(float)(a.y-b.y)/(a.x-b.x);
if (map.get(k)==null){
map.put(k,1);
}else{
map.put(k,map.get(k)+1);
}
}
}
int max=vtl;
for (float k:map.keySet()){
max=Math.max(max,map.get(k));
}
res=Math.max(res,max+dup);
}
return res;
}
}
两层遍历,第一遍遍历所有点。记录每一个点到其他点的(斜率,点数)的HashMap。需要注意的是垂直点(斜率不存在),重复点。最大点数应该是垂直点和一般点中的最大者再加上重复点。每遍历一个点更新一次,就能找到一条线上的最大值。