美文网首页
max-points-on-a-line.md

max-points-on-a-line.md

作者: wymhuster | 来源:发表于2018-09-24 18:48 被阅读0次

    1、题目

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

    2、解法

    2.1、自己的解法:

    /**
     * Definition for a point.
     * class Point {
     *     int x;
     *     int y;
     *     Point() { x = 0; y = 0; }
     *     Point(int a, int b) { x = a; y = b; }
     * }
     */
    import java.util.HashMap;
    class PointAndK{
        int x;
        int y;
        double k;
        PointAndK(int a,int b,double c){
            x = a;y = b;k = c;
        }
    }
    public class Solution {
        public int maxPoints(Point[] points) {
            HashMap<Integer,Integer> horizontal = new HashMap<>();
            HashMap<Integer,Integer> vertical = new HashMap<>();
            HashMap<PointAndK,Integer> other = new HashMap<>();
            for(Point point:points){
                horizontal.put(point.y,0);
                vertical.put(point.x,0);
            }
            for(int i = 0;i<points.length;i++){
                for(int j = 0;j<points.length&&i!=j;j++){
                    int x = points[i].x-points[j].x;
                    int y = points[i].y-points[j].y;
                    if(x!=0 && y!= 0){
                        double k = y*1.0/x;
                        other.put(new PointAndK(points[i].x,points[i].y,k),0);
                    }
                }
            }
            for(PointAndK p:other.keySet()){
                for(Point point:points){
                    int x = p.x-point.x;
                    int y = p.y-point.y;
                    if(x!=0&&y!=0){
                        double k = y*1.0/x;
                        if(Double.doubleToLongBits(k) == Double.doubleToLongBits(p.k)){
                            int val = other.get(p);
                            other.put(p,val+1);
                        }
                    }else if(x == 0 && y == 0){
                        int val = other.get(p);
                        other.put(p,val+1);
                    }
                }
            }
            for(Point point:points){
                int v1 = horizontal.get(point.y);
                horizontal.put(point.y,v1+1);
                int v2 = vertical.get(point.x);
                vertical.put(point.x,v2+1);
            }
            int result1 = getMaxCount(horizontal);
            int result2 = getMaxCount(vertical);
            int result3 = 0;
            for(PointAndK p:other.keySet()){
                if(other.get(p)>result3){
                    result3 = other.get(p);
                }
            }
            return Math.max(result1,Math.max(result2,result3));
        }
     
        public int getMaxCount(HashMap<Integer,Integer> map) {
            int result = 0;
            for (Integer key : map.keySet()) {
                if (map.get(key) > result) {
                    result = map.get(key);
                }
            }
            return result;
        }
         
         
    }
    

    2.2、别人的解法

    public class Solution {
        public int maxPoints(Point[] points) {
            //关键在于判断三点共线,两平行直线有且只有一个交点,所以有一个中间点,这个中间点与另外两个端点的连线的斜率相等
            //由比率的性质
            int ABx;
            int ABy;
            int BCx;
            int BCy;
    
            if(points.length<=2) return points.length;
            int max=2;//用来记录最大个数
    
            for(int i=0;i<points.length;i++){
                int num=0;
                int temp=1;
    
                for(int j=i+1;j<points.length;j++){
                    ABx=points[i].x-points[j].x;
                    ABy=points[i].y-points[j].y;
                    if(ABx==0 && ABy==0)//表示出现重复点
                    {
                        num++;
                    }else{
                        temp++;
                        for(int k=j+1;k<points.length;k++){
                            BCx=points[j].x-points[k].x;
                            BCy=points[j].y-points[k].y;
                            if(ABx*BCy==BCx*ABy){//表示两个斜率相等,转化为乘积的形式可以避免分母为0的情况
                                temp++;
                            }
                        }
                    }
                    if(max<(num+temp)){
                      max=num+temp;
                    }
                    temp=1;
                }
    
            }
            return max;
        }
    }
    

    笔记上是别人的代码,这段代码通过三层for循环来求解,并且没有使用hashmap。比自己的答案要精炼很多

    相关文章

      网友评论

          本文标题:max-points-on-a-line.md

          本文链接:https://www.haomeiwen.com/subject/pfrhoftx.html