题目描述:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
题意:
这道题目,是给出n个点,他们之间可以划线,求出哪条线上的点数最多,返回最多点的个数。注意重合点和垂直点
解题思路:
我一直的想法是,双循环遍历所有的点,求出所有直线的y=kx+b,及map<map<k,b>,count> ,然后垂直的点单独存储。然后遍历所有的点,看她在哪个k,b上如果在这条线的个数加一,然后还要判断是否也在垂直的线上。一直找不出这个方法的错误思路是否有错误。可能小数点精度有影响(自己的想法)。
正确的解题思路是,从第一个点开始,和其他的点开始比较。三个计数map<k,count>,重复count,垂直count,两个点确定一条直线嘛,所以如果是同一个点,重复的count+1,如果垂直,垂直count+1,否则map[k]+1.然后经过这个点的所有直线都有啦,(垂直和倾斜的)。然后求出这组直线,哪条直线点数最多,返回值就好,最终选出最大的值。
如图:
int maxPoints(vector<Point> &points) {
if(points.size()==0){
return 0;
}
if(points.size()==1 || points.size()==2){
return points.size()==1?1:2;
}
int res=0;
for(int i=0;i<points.size()-1;i++){
map<float,int> maps;
int curMax=1; //记录当前最大值
int vline=0; //记录垂直点数
int dup=0; //记录重复点数
for(int j=i+1;j<points.size();j++){
float ky=points[i].y-points[j].y;
float kx=points[i].x-points[j].x;
if(kx==0 && ky==0){
dup++;
}else if(kx==0){
if(vline==0){
vline=2;
}else{
vline++;
}
curMax=max(curMax,vline);
}else{
float k=ky/kx;
if(maps[k]==0){
maps[k]=2;
}else{
maps[k]++;
}
curMax=max(curMax,maps[k]);
}
}
res=max(res,curMax+dup);
}
return res;
}