Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
从每个点出发,尝试和其他点构成直线,计算斜率塞入hashmap,在同一条直线上的点必然会有相同的斜率。
注意斜率不存在的情况和 重复点的情况。
public int maxPoints(Point[] points)
{
int len=points.length;
if(len<3)
return len;
int max=0;
for(int i=0;i<len;i++)
{
HashMap<Double, Integer> hashmap=new HashMap<>();
Point pi=points[i];
int dup=0;
for(int j=0;j<len;j++)
{
if(j==i)
continue;
Point pj=points[j];
if(pi.x==pj.x&&pi.y==pj.y)
{
dup++;
continue;
}
double k=pi.x==pj.x?Double.MAX_VALUE:((double)(pj.y-pi.y))/(pj.x-pi.x);
if(!hashmap.containsKey(k))
hashmap.put(k, 1);
else {
hashmap.put(k, hashmap.get(k)+1);
}
}
if(hashmap.size()==0)
max=Math.max(max, dup+1);
else {
for(int a:hashmap.values())
max=Math.max(a+dup+1, max);
}
}
return max;
}