Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
用斜率算,遍历每一个点,然后以这个点和剩下的所有点连线,斜率相同的放在hash的同一位置。如果有和这个点相同的点统计下来最后算进去。
Source
public int maxPoints(Point[] points) {
if(points.length <= 1) return points.length;
int max = 1;
for(int i = 0; i < points.length; i++){
HashMap<Float, Integer> hm = new HashMap<Float, Integer>(); //注意key是float类型,并且必须是Float Integer而非float int
int k = 0, lmax = 1;
for(int j = 0; j < points.length; j++){
if(i == j) continue;
if(points[i].x == points[j].x && points[i].y == points[j].y){ //***跟当前i点重合的点的个数
k ++;
continue;
}
float slope = ((float)(points[i].y - points[j].y) / (points[i].x - points[j].x));
//运算时一定要在等式右边加上float,否则是将数当做整型运算完再赋值给左边的float
if(hm.containsKey(slope)){
hm.put(slope, hm.get(slope) + 1);
}
else hm.put(slope, 2);
}
for(Integer val : hm.values())
lmax = Math.max(lmax, val);
lmax += k;
max = Math.max(max, lmax);
}
return max;
}
Test
public static void main(String[] args){
Point[] points = new Point[2];
Point a = new Point(1,2);
points[0] = a;
points[1] = a;
System.out.println(new Solution().maxPoints(points));
}