题目不难,但是要求考虑细节部分很多,同样的两个点默认在一条直线上,默认两点共线,但是这两个点要求不相同,求出最多有几个点共线
/**
* Definition for a point.
* class Point {
* int x;
* int y;
* Point() { x = 0; y = 0; }
* Point(int a, int b) { x = a; y = b; }
* }
*/
import java.util.*;
public class Solution {
public int maxPoints(Point[] points) {
int len=points.length,longest=2,same=0;
if(len==0)
return 0;
if(len==1)
return 1;
double[] k=new double[len-1];//构造一个斜率数组
double k2;
for(int i=0;i<len;i++){
int index=0;int lianXu=2;same=0;//默认前两个点不同,而且在一条线上
for(int j=0;j<len;j++){//自己和自己的斜率不用算进去了
if(i==j)
continue;
int x0=points[i].x-points[j].x;
int y0=points[i].y-points[j].y;
if(x0==0&&y0!=0){
k2=max;
}else if(x0==0&&y0==0){
same++;//统计相同点的数目
k2=-max;
}else{
k2=(1.00*y0)/(1.00*x0);//求出任意两点之间斜率
}
k[index]=k2;
index++;
}
Arrays.sort(k);//对斜率数组进行排序
if(k.length==1)//只有两个点,那么两个点必然在一条线上
return 2;
if(k[0]==-max&&k[1]==-max)
lianXu=1;//如果前两个点相同的话,初始在一条直线上的点归结为1
lianXu=lianXu+same;//把相同的点数考虑进来
int temp=lianXu;//初始值存储起来
for(int m=0;m<k.length-1;m++){
if(k[m]==k[m+1]&&k[m]!=-max)
lianXu++;
else
lianXu=temp;
if(lianXu>longest)
longest=lianXu;
}
}
return longest;
}
private static double max=1e6;
}