1.问题描述:
给定2D空间的一个顶点集,判断在同一条直线上的最多点数
2.解题思路:
1)判断若顶点集的大小<=2,则直接返回顶点集大小
2)否则利用穷举法,产生任意两点构成直线的情况
3)统计上述产生的每条直线,最多共有多少个顶点
3.1)若构成直线的两点重合,则相同点计数器+1
3.2)寻找构成直线的第二个顶点后面同在一条直线上的点 (斜率判断,乘法表示)
3.3)相同点个数+同在一条直线上的个数就等于此直线上的最多点数,然后与全局最大值比较,更新最大值
3.解题源码
public
class
Solution {
public
int
maxPoints(Point[] points) {
//关键在于判断三点共线,两平行直线有且只有一个交点,所以有一个中间点,这个中间点与另外两个端点的连线的斜率相等
//由比率的性质
int
ABx;
int
ABy;
int
BCx;
int
BCy;
if
(points.length<=
2
)
return
points.length;
int
max=
2
;
//用来记录最大个数
for
(
int
i=
0
;i<points.length;i++){
int
num=
0
;
int
temp=
1
;
for
(
int
j=i+
1
;j<points.length;j++){
ABx=points[i].x-points[j].x;
ABy=points[i].y-points[j].y;
if
(ABx==
0
&& ABy==
0
)
//表示出现重复点
{
num++;
}
else
{
temp++;
for
(
int
k=j+
1
;k<points.length;k++){
BCx=points[j].x-points[k].x;
BCy=points[j].y-points[k].y;
if
(ABx*BCy==BCx*ABy){
//表示两个斜率相等,转化为乘积的形式可以避免分母为0的情况
temp++;
}
}
}
if
(max<(num+temp)){
max=num+temp;
}
temp=
1
;
}
}
return
max;
}
}
|