题目

代码分析

如何判断在一个直线上,是本题的关键,对于该题来说,就是要两两匹配其中的点,也就是要通过两层的for循环,前面的算过了,后面就不需要再算了,因为外层的每一次的循环都以一个点为基准,所以只需要判断平行,垂直,水平就可以了,判断是在以一个点开始为基准的。然后就是每一次的外层循环都要初始化一下最大值。

代码实现

class Solution {
    public int maxPoints(int[][] points) {
        if(points.length<=1) return points.length;
        int result=0;
        HashMap<Double,Integer> map;
        for(int i=0;i<points.length-1;i++)
        {
            map=new HashMap<>();
            int max=1;
            int coincide=0;
            int vertical=1;
            int horizontal=1;
            int ix=points[i][0];
            int iy=points[i][1];
            for(int j=i+1;j<points.length;j++)
            {
                int jx=points[j][0];
                int jy=points[j][1];
                double x=ix-jx;
                double y=iy-jy;
                //算出重合的点
                if(x==0&&y==0)
                {
                    coincide+=1;
                }else if(y==0)//算出平行的点
                {
                    horizontal+=1;
                    max=Math.max(max,horizontal);
                }else if(x==0)////算出垂直的点
                {
                    vertical+=1;
                    max=Math.max(max,vertical);
                }
                else
                {
                    double rate=x/y;
                    if(map.containsKey(rate))
                    {
                        map.put(rate,map.get(rate)+1);
                    }else
                    {
                        map.put(rate,2);
                    }
                    max=Math.max(max,map.get(rate));
                }
            }
            result=Math.max(result,max+coincide);
        }
        return result;
    }
}

完成情况

1次