Given
n
points on a 2D plane, find the maximum number of points that lie on the same straight line.
Subscribe to see which companies asked this question
题目分析:给定任意多个点,找到在一条线上最多的点。都知道两点构成一条直线,如果要求另一点也在这条直线上,那个这个点跟其中任何一个点的斜率必须要求一致。针对每个点,可以找到其他点跟它组成的直线中点最多的,跟它组成的直线,斜率一样的一定在一条直线上。这样复杂度为o(n^2)。
我们考虑对每个点,建一条斜率与点数的对应关系表,如果是竖着的直线,则斜率为无穷大。
需要特殊处理的情况如下:
1. 当没有点,或者只有一个点的时候,可以直接返回数组长度。
Subscribe to see which companies asked this question
题目分析:给定任意多个点,找到在一条线上最多的点。都知道两点构成一条直线,如果要求另一点也在这条直线上,那个这个点跟其中任何一个点的斜率必须要求一致。针对每个点,可以找到其他点跟它组成的直线中点最多的,跟它组成的直线,斜率一样的一定在一条直线上。这样复杂度为o(n^2)。
我们考虑对每个点,建一条斜率与点数的对应关系表,如果是竖着的直线,则斜率为无穷大。
需要特殊处理的情况如下:
1. 当没有点,或者只有一个点的时候,可以直接返回数组长度。
2.需要考虑重复点
3. 计算斜率的时候,需要指定一个方向,比如X大的作为被减数
4. 对于每个点,都要更新max
源代码如下:
public int maxPoints(Point[] points) {
/**当没有点,或者只有一个点的时候,可以直接返回数组长度。*/
if(points.length<=1) return points.length;
int max=0;
int len=points.length;
for(int i=0;i<len;i++)
{
Map<Double,Integer> map=new HashMap<Double,Integer>();
int dup=1;/**当前点包含在内*/
for(int j=0;j<len;j++)
{
double k=0.0;
if(j==i) continue;
if(points[i].x==points[j].x)
{
/***考虑重复点*/
if(points[i].y==points[j].y)
{
dup++;
continue;
}
/**竖线斜率无穷大*/
else
{
k=Double.MAX_VALUE;
}
}
else
{
if(points[i].x>points[j].x)
k=((double)(points[i].y-points[j].y))/(points[i].x-points[j].x);
else
k=((double)(points[j].y-points[i].y))/(points[j].x-points[i].x);
}
if(map.containsKey(k))
{
map.put(k, map.get(k)+1);
}
else
{
map.put(k, 1);
}
}
double key;
if(map.size()==0) max=max>dup?max:dup;
for(Double d:map.keySet())
{
max=max>dup+map.get(d)?max:dup+map.get(d);
}
}
return max;
}