Q:对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
A:
这个题……很多坑……写了好几次才写对。
最重要的一点,在计算斜率时,不能使用除法,会有误差。可以使用最大公约数。
public static int maxPoints(Point[] points) {
//点数个数判断
if (points.length <= 1)
return points.length;
List<Integer> list = new ArrayList<>();
int count;
int max = 0;
int size = points.length;
//我这里做了防止同一条线重新计算
boolean[][] flag = new boolean[size][size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
flag[i][j] = i != j;
}
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size; j++) {
if (!flag[i][j])
continue;
//水平,垂直,同点三种方法判断
if (points[i].x == points[j].x) {
for (int k = 0; k < size; k++) {
if (points[k].x == points[i].x)
list.add(k);
}
} else if (points[i].y == points[j].y) {
for (int k = 0; k < size; k++) {
if (points[k].y == points[i].y)
list.add(k);
}
//有斜率的线
} else {
int x0 = points[i].x - points[j].x;
int y0 = points[i].y - points[j].y;
int a = gcd(x0, y0);
x0 = x0 / a;
y0 = y0 / a;
for (int k = 0; k < size; k++) {
int x = points[i].x - points[k].x;
int y = points[i].y - points[k].y;
if ((x == 0 && y == 0)) {
list.add(k);
} else {
int b = gcd(x, y);
x = x / b;
y = y / b;
if (x == x0 && y == y0)
list.add(k);
}
}
}
count = list.size();
if (count > max)
max = count;
for (int m = 0; m < list.size() - 1; m++) {
for (int n = m + 1; n < list.size(); n++) {
flag[m][n] = false;
flag[n][m] = false;
}
}
list.clear();
}
}
return max;
}
//最大公约数计算,一定一定要判断b是否为0
public static int gcd(int a, int b) {
return (b == 0) ? a : gcd(b, a % b);
}