149. Max Points on a Line

来源:互联网 发布:windows系统安装工具 编辑:程序博客网 时间:2024/05/29 09:24
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

原创粉丝点击