题目大意
这道题给定n个点,然后求最多有多少个点可以共线。
分析
我用了比较朴素的算法,枚举两个不重合的点来计算一条直线,然后判断所有的点有多少会在这条直线上,进而求出最大值,为了避免直线不存在的情况,我这里使用的两点式方程求直线。
注意一种极端情况,就是所有的点都是同一个点,那么不存在直线,直接返回n即可。
代码
public int maxPoints(int[][] points) {
int n = points.length;
if(n <= 2) {
return n;
}
boolean tag = true;
for(int i = 0; i < n - 1; i++) {
if((points[i][0] != points[i + 1][0]) || (points[i][1] != points[i + 1][1])) {
tag = false;
break;
}
}
if(tag) {
return n;
}
int ans = 0;
for(int i = 0; i < n - 1; i++) {
int x1 = points[i][0], y1 = points[i][1];
for(int j = i + 1; j < n; j++) {
int x2 = points[j][0], y2 = points[j][1];
if(x1 == x2 && y1 == y2) {
continue;
}
// (x - x1)/(x1 - x2) = (y - y1)/(y1 - y2) -> (x - x1)(y1 - y2) = (y - y1)(x1 - x2)
int cnt = 0;
for(int k = 0; k < n; k++) {
int x = points[k][0], y = points[k][1];
if((x - x1) * (((long)(y1)) - y2) == (y - y1) * (((long)(x1)) - x2)) {
cnt++;
}
}
if(cnt > ans) {
ans = cnt;
}
}
}
return ans;
}