题目描述
对于给定的n个位于同一二维平面上的点,求最多能有多少个点位于同一直线上
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
思路:
二重循环 point_i point_j 每次分析起始点point_i分析各个斜率上点的数目
最后输出最多的同一直线上点数目。
class Solution {
public:
int maxPoints(vector<Point> &points) {
int size=points.size();//点的数目
if(size==0 || size==1)
return size;
//point_i
int res=1;//最终结果
for(int i=0;i<size;i++)
{
int cur_res=1;//当前结果 至少包含point_i
map<double,int> mp;//存放指定斜率的点
int dup=0;//重复的点
int vert=0;//垂直的点
for(int j=0;j<size;j++)
{
if(j==i) //遍历所有剩余的点
continue;
int x=points[i].x-points[j].x;
int y=points[i].y-points[j].y;
if(x==0 && y==0) //说明重复
{
dup++;
continue;
}
if(x==0 && y!=0) //计算斜率需要考虑垂直情况
{
if(vert==0) //考虑垂直这条线的所有可能重复的点
vert=2;
else
vert++;
cur_res=max(cur_res,vert);//分析垂直的这条线是否点更多
continue;
}
double ratio=double(y)/double(x);//计算斜率
if(mp[ratio]==0)
mp[ratio]=2;
else
mp[ratio]++;
cur_res=max(cur_res,mp[ratio]);//分析ratio这条线点是否更多
}
//分析完所有斜率的直线结果后,累加上重复的点
cur_res=cur_res+dup;
res=max(res,cur_res);
}
return res;
}
};