Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
给定2D平面上的n个点,找到位于同一直线上的最大点数
- 运用穷举的方法
- 两点组成一条直线
- 若无特殊情况,当点a与b组成直线的斜率,和点b与c组成直线的斜率相同时,则认为这三个点a、b、c是在同一直线上的
- 特殊情况是:当点b与a重复
- 若平面中没有点: points.length==0 return 0;
- 若平面中只有一个或者两个点: points.length<=2 return points.length;
- 若平面中至少有三个点: 进行遍历循环
- for 将每个点都当做第一个点a进行遍历:
2.for : ~若第二个点b与第一个点a是否重复-- 得到重复的点rep的数量
~点b若不重复带点a--得到不重复的点的数量kp:
3.for:对第三个点c进行遍历,判断cb之间的斜率是否与ab的斜率相同;
~若相同,则kp++;
~最大点数=rep+kp;在得到最大点数之后,kp都要归1,以进行下一个数的遍历;
public class MaxPoints {
//给定2D平面上的n个点,找到位于同一直线上的最大点数
public int maxPoints(Point[] points) {
if(points.length == 0) {
return 0;
}
if(points.length <= 2 && points.length > 0) {
return points.length;
}
int max = 2;
for(int i = 0 ; i < points.length ; i++ ) {
int rep = 0;//重复的点的个数
int kp = 1;//在这条直线下有几个非重复点
for(int j = i + 1 ; j < points.length ; j++ ) {
double x1 = points[j].x - points[i].x;
double y1 = points[j].y - points[i].y;
if(x1 == 0 && y1 == 0) {
rep++;
}else {
kp++;
for(int k = j + 1 ; k < points.length ; k++ ) {
double x2 = points[k].x - points[j].x;
double y2 = points[k].y - points[j].y;
if(x1 * y2 == x2 * y1) {
kp++;
}
}
}
if(max < (rep + kp)) {
max = rep + kp;//最大点的个数为同一条直线上的点加上重复点
}
kp = 1;//每次开始循环遍历第二个点时,都需要将kp重置为1;
}
}
return max;
}
}
//class Point {
// int x;
// int y;
// Point() { x = 0; y = 0; }
// Point(int a, int b) { x = a; y = b; }
// }
代码参考自: