第三题:
Max Points on a Line
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
题目要求:在二维空间内,给定N个点,求由这些点组成的直线中,在一条线上最多点的个数。
例如:(1,1)、(1,2) 、(2,3)、(5,4)、(1,3)由这些点根据斜率可以组成很几条线,其中出现点数最多的线上有三个点,所以返回值为3.
在写的过程中要注意几种情况,否则导致一直错误(深有体会):
(1)给出的点中有相同的点。
(2)算斜率的时候分母值为0。
(3)每次扫描时,要计算当前的斜率是否已经存在,不存在的话加入到map中,使用map可以减少自己去建立数据结构,然后再进行比较的麻烦。
(4)在最后当前值与最大值进行比较的时候,千万别忘了相同的点出现的次数(因为我自己忘记过╮(╯▽╰)╭)。
class Solution {
public:
int maxPoints(vector<Point> &points) {
if (points.size() <= 2)
{
return points.size();
}
int maxnum = 0;
for (int i = 0; i < points.size(); i++)
{
Point start = points[i];
map<double, int> lineNumCount;
int curnum = 1;
int issame = 0;
double xdifiszero = INT_MAX;
for (int j = i + 1; j < points.size(); j++)
{
if ((points[i].x == points[j].x) && (points[i].y == points[j].y))
{
issame++;
continue;
}
int xdif = points[j].x - points[i].x;
int ydif = points[j].y - points[i].y;
if (xdif == 0)
{
if (lineNumCount.find(xdifiszero) == lineNumCount.end())
{
lineNumCount.insert(map<double, int>::value_type(xdifiszero, 2));
curnum = (curnum > 2 ? curnum : 2);
}
else
{
lineNumCount[xdifiszero]++;
curnum = (curnum > lineNumCount[xdifiszero] ? curnum : lineNumCount[xdifiszero]);
}
}
else
{
double k = ydif*1.0/xdif;
if (lineNumCount.find(k) == lineNumCount.end())
{
lineNumCount.insert(map<double, int>::value_type(k, 2));
curnum = (curnum > 2 ? curnum : 2);
}
else
{
lineNumCount[k]++;
curnum = (curnum > lineNumCount[k] ? curnum : lineNumCount[k]);
}
}
}
maxnum = (maxnum > (curnum + issame)? maxnum : (curnum + issame));
}
return maxnum;
}
};