牛客网LeetCode部分:
Given n points on a 2D plane, find the maximum number of points that
lie on the same straight line.
2d平面上有n个点,求同在一条直线上的点的最大数量
思路
俩点确定一条直线,先确定起始点,然后遍历剩下的n-1个点,最大可以构成n-1条直线,这n-1条直线中斜率相同的直线属于同一条直线,即该条直线上的点数加1,如果剩下的n-1个点中有与其实点坐标相同的点,那么所有点都加1;改变起始点直到所有的点都遍历完毕
1.第一重循环遍历起始点
2.第二重循环构建直线,并保存每条直线的斜率,考虑斜率为无穷大以及第二个点与起始点坐标相同的情况
3.对斜率排序,这样相同斜率会相邻
4.统计相同的斜率的个数,并把结果保存在一个数组里,数组中的每一个值都代表一个不同的斜率出现的次数,也就是同一条直线上点的个数
5.增加与起始点相同的点的个数
6.循环
7.返回结果数组的最大值加1,因为要加上起始点本身。
由于float的比较不能直接用==,所以特别定义一个比较函数
代码
bool equa(float num1, float num2)
{
float sum = num1 - num2;
if(sum < 0.00000001 && sum > -0.00000001)
return true;
else
return false;
}
int maxPoints(vector<Point> &points)
{
int length = points.size();
vector<float> gradient;
vector<int> line(1, 0);
int indexLine = 0;
int count = 0;
for(int i = 0; i < length; ++i)
{
for(int j = i + 1; j < length; ++j)
{
float newgradient = 0.0;
if((points[i].x - points[j].x) != 0)
newgradient = (float)(points[i].y - points[j].y) / (float)(points[i].x - points[j].x);
else if((points[i].y - points[j].y) == 0)
{
++count;
continue;
}
else
newgradient = 65535.0;
gradient.push_back(newgradient);
}
sort(gradient.begin(), gradient.end());
// for(vector<float>::iterator it = gradient.begin(); it != gradient.end(); ++it)
// {
// cout << *it << " ";
// }
// cout << endl;
vector<float>::iterator beginIt = gradient.begin();
for(vector<float>::iterator it = gradient.begin(); it != gradient.end(); ++it)
{
if(equa(*beginIt, *it))
++line[indexLine];
else
{
line.push_back(1);
line[indexLine] += count;
++indexLine;
beginIt = it;
}
}
// for(vector<int>::iterator it = line.begin(); it != line.end(); ++it)
// cout << *it << "\t";
// cout << endl;
line[indexLine] += count;
// cout << line[indexLine] << endl;
line.push_back(0);
++indexLine;
count = 0;
gradient.clear();
}
sort(line.begin(), line.end());
if(length < 1)
return 0;
return *(line.end() - 1) + 1;
}