LeetCode 149. Max Points on a Line

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值