最多有多少个点在一条直线上
给出二维平面上的n个点,求最多有多少点在同一条直线上。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出4个点:(1, 2)
, (3, 6)
, (0, 0)
, (1, 3)
。
一条直线上的点最多有3个。
标签
分析:这道题就是取一个点point,然后计算其他的点与这个点的斜率,用一个hash map记录斜率与个数的映射。另外还要考虑与当前点坐标相同的点、横坐标相同斜率无穷大的点。然后对一个点循环完一次取其map中斜率出现最多的次数。(这里我以为unordered_map有函数可以直接取值中最大的值,没找到只能整个map遍历一遍)
/**
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
class Solution {
public:
/*
* @param points: an array of point
* @return: An integer
*/
int maxPoints(vector<Point> &points) {
// write your code here
int num=0;//记录点个数
unordered_map<double,int> mp;//记录斜率和点的个数
for(int i=0;i<points.size();i++){
mp.clear();//每次进来清空map
mp[INT_MIN]=0;//这个是在map中占个位置,防止只有一个点的时候进不到map的循环中
Point pi=points[i];
int duplicate=1;//记录重复的点
for(int j=0;j<points.size();j++){
if(i==j)
continue;
else if((pi.x==points[j].x)&&pi.y==points[j].y)
{
duplicate++;
continue;
}
double k=pi.x==points[j].x ? INT_MAX:(double)(pi.y-points[j].y)/(pi.x-points[j].x);
mp[k]++;
}
for(auto n:mp)//寻找次数最多的斜率
if(n.second+duplicate>num)
num=n.second+duplicate;
}
return num;
}
};
最多有多少个点在一条直线上
Accepted
总耗时:
421 ms
100% 数据通过测试.