Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
问题描述:在一个二维平面上有n个点,求出现在同一直线上的点的最大个数
分析:对每一个点计算与其他点(不包括与该点相同的点)连接成的直线的斜率,斜率重复出现的最大次数加成该点重复出现的个数,即为该点所在直线上拥有的最大点个数(比如该点既出现在直线L1上,又出现在直线L2上,直线L1上有这n个点中的3个点,直线L2上有这n个点中的5个点,我们得到的该点所处直线的拥有最多点的那一条直线上的点个数便是5,有点绕口~~)。
对每一个点进行相同的操作,便可得到n个点中出现在同一直线的点的最大个数。
实现:
/**
* 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:
bool inOneLine(Point p1, Point p2, Point p3)
{
return ((p3.y-p1.y)*(p2.x-p1.x) == (p2.y-p1.y)*(p3.x-p1.x));
}
bool equal(Point p1, Point p2)
{
return (p1.x == p2.x || p1.y == p2.y);
}
int maxPoints(vector<Point> &points) {
if(points.size() <= 2)
{
return points.size();
}
int ans = 2;
int n = points.size();
for(int i = 0; i < n-1; i ++)
{
for(int j = i+1; j < n; j ++)
{
int sum = 0;
if(equal(points[i], points[j]))
{
for(int k = 0; k < n; k ++)
{
if(equal(points[i], points[k]))
{
sum ++;
}
}
}
else
{
for(int k = 0; k < n; k ++)
{
if(inOneLine(points[i], points[j], points[k]))
{
sum ++;
}
}
}
ans = max(ans, sum);
}
}
return ans;
}
};