LeetCode 149. 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.
分析
这道题基本上采用枚举,但实现的细节可以被优化:
采用两点式描述直线,可以避免斜率不存在的状况
若这个点在一条直线上,则不再作它与这条直线上的点的连线
计算重复点(这个步骤我用了map,所以重定义了Point为Points,并提供<操作符的方法)
代码实现
class Solution {
private:
struct Line {
int index_p1;
int index_p2;
int num;
Line(int a, int b,int n) : index_p1(a), index_p2(b), num(n) {}
};
struct Points {
Point p;
bool operator < (const Points &points) const {
if( p.x != points.p.x )return p.x < points.p.x;
else return p.y < points.p.y;
}
Points(Point a) {
p = a;
}
};
public:
int maxPoints(vector<Point>& points) {
if (points.empty())return 0;
vector<Line> lines;
map<Points, int> book;
for (vector<Point>::iterator it = points.begin(); it != points.end();) {
if (book.count(Points(*it))) {
book[Points(*it)] += 1;
it = points.erase(it);
}
else {
book[Points(*it)] = 1;
it++;
}
}
if (points.size() < 2)return book[Points(points[0])];
lines.push_back(Line(0, 1, book[Points(points[0])] + book[Points(points[1])]));
for (int index = 2; index < points.size(); index++) {
set<int> check;
for (int index_line = 0; index_line < lines.size(); index_line++)
if (check_point_in_line(points[index], lines[index_line], points)) {
lines[index_line].num += book[Points(points[index])];
check.insert(lines[index_line].index_p1);
check.insert(lines[index_line].index_p2);
}
for (int index_line = 0; index_line < index; index_line++)
if (check.count(index_line) == 0)lines.push_back(Line(index_line, index, book[Points(points[index_line])] + book[Points(points[index])]));
}
int max_num = 2;
for (int index_line = 0; index_line < lines.size(); index_line++)
max_num = max_num > lines[index_line].num ? max_num : lines[index_line].num;
return max_num;
}
bool check_point_in_line(Point &p, Line l, vector<Point>& points) {
if(points[l.index_p1].y != points[l.index_p2].y && points[l.index_p1].x != points[l.index_p2].x)return (p.y - points[l.index_p2].y) * 1.0 / (points[l.index_p1].y - points[l.index_p2].y) == (p.x - points[l.index_p2].x) *1.0 / (points[l.index_p1].x - points[l.index_p2].x);
else if (points[l.index_p1].y == points[l.index_p2].y)return p.y == points[l.index_p1].y;
else if (points[l.index_p1].x == points[l.index_p2].x)return p.x == points[l.index_p1].x;
}
};