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

京公网安备 11010502036488号