Given
n
points on a 2D plane, find the maximum number of points that lie on the same straight line.
不愧是hard
一开始考虑的是 只要y/x的值相等,就在一条直线上,但是对于(1,2),(1,3)呢,也是在一条直线上的
想一下直线的表达式: y=ax+b
public int maxPoints(Point[] points) {
if (points==null) return 0;
if (points.length<=2) return points.length;
Map<Integer,Map<Integer,Integer>> map = new HashMap<Integer,Map<Integer,Integer>>();
int result=0;
for (int i=0;i<points.length;i++){
map.clear();
int overlap=0,max=0;
for (int j=i+1;j<points.length;j++){
int x=points[j].x-points[i].x;
int y=points[j].y-points[i].y;
if (x==0&&y==0){
overlap++;
continue;
}
int gcd=generateGCD(x,y);//求最大公约数
if (gcd!=0){
x/=gcd;
y/=gcd;
}
//x,y分别除以gcd 之后就以x,y来代表斜率
//实际上用x/y来代表斜率也可以 但是会比较麻烦 1.需要用double表示 2.y等于0需要特殊处理
if (map.containsKey(x)){
if (map.get(x).containsKey(y)){
map.get(x).put(y, map.get(x).get(y)+1);
}else{
map.get(x).put(y, 1);
}
}else{
Map<Integer,Integer> m = new HashMap<Integer,Integer>();
m.put(y, 1);
map.put(x, m);
}
max=Math.max(max, map.get(x).get(y));
}
result=Math.max(result, max+overlap+1);
}
return result;
}
private int generateGCD(int a,int b){
if (b==0) return a;
else return generateGCD(b,a%b);
}
一篇讲辗转相除法很好的文章:
http://www.ailab.cn/view/2016101913850.html