在一个二维平面上,求最大的点个数,要求这些点在一条直线上。
1、题目描述
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
2、思路
首先,两点确定一条直线;
假设某点A在最终的解中,那么只要分别计算出点A和剩余其它n-1个点的斜率,就可以得到包含点A的所有斜率。因为这些斜率都包含点A,所以斜率相同的肯定在一条直线上。由此可以计算经过点A的所有斜率中,包含点个数最多的那一条直线。
只要像处理点A一样,遍历剩余每个点,经过比较,就可以算出最终的解。
3、代码思路
需要两重循环,第一重循环遍历起始点a,第二重循环遍历剩余点b。
a和b如果不重合,就可以确定一条直线。
对于每个点a,构建 斜率->点数 的map。
(1)b与a重合,以a起始的所有直线点数+1 (用dup统一相加)
(2)b与a不重合,a与b确定的直线点数+1
4、代码
/**
* 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:
int maxPoints(vector<Point> &points) {
if (points.size() == 0)
return 0;
if (points.size() == 1)
return 1;
int res = 0;
for (int i = 0; i < points.size(); ++i) {
int curMax = 1;
int vCnt = 0; //记录和i垂直线上的点
int dupCnt = 0; //记录和i重复的点
map<double, int> m;
for (int j = 0; j < points.size(); ++j) {
if (i != j) {
double x = points[i].x - points[j].x;
double y = points[i].y - points[j].y;
if (x == 0 && y == 0)
++dupCnt;
else if (x == 0)
++vCnt;
else {
double k = y / x;
if (m[k] == 0)
m[k] = 2;
else
m[k]++;
curMax = max(curMax, m[k]);
}
}
}
curMax = max(curMax, vCnt + 1); //和i垂直的线上的点个数比较
res = max(res, curMax + dupCnt);
}
return res;
}
};