题目
代码分析
如何判断在一个直线上,是本题的关键,对于该题来说,就是要两两匹配其中的点,也就是要通过两层的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次