LeetCode -- 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.

------------------------------------------------------------------------------

最开始的时候感觉这个题目好像很难,后来想想,直接用暴力不就解决了吗?

中间遇到几个坑:

1. 两点确定一条直线,但是这两个点必须是不同的点;

2.  当两点的x或者y值相同的时候,要特殊处理一下;

3.  当点集中存在重复的点的时候,要考虑几种情况:如果点集中的点都是相同的点,那么按照1的原则就不能找到两个不同的点,此时要特殊处理下;如果点集中有相同的点,但是不止一个位置的时候,1和2其实就可以处理了,这种情况不需要特殊对待。

4. 当用sort对点集进行排序的时候,要自己写一个比较函数,直接用bool comp()这个函数编译总是不通过,用struct 定义operator就可以,知识盲点。

代码如下:

/**
 * 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() < 3)
            return points.size();
        sort(points.begin(), points.end(), myobj);
        if(same(*(points.begin()), *(points.rbegin())))
            return points.size();
        int max = 0;
        for(int i = 0; i < points.size(); ++i)
        {
            for(int j = i+1; j < points.size(); ++j)
            {
                int cnt = 0;
                if(same(points[i], points[j])){
                    continue;
                }
                for(int k = 0; k < points.size(); ++k)
                    cnt += isLine(points[i], points[j], points[k]);
                max = max >= cnt ? max : cnt;
            }
        }
        return max;
    }
    struct myclass{
        bool operator()(Point a, Point b){
            return a.x < b.x || (a.x == b.x && a.y < b.y);
        }
    }myobj;
    bool same(Point a, Point b){
        return a.x == b.x && a.y == b.y;
    }
    int isLine(Point a, Point b, Point c)
    {
        if(a.x == b.x && a.x == c.x)
            return 1;
        if(a.y == b.y && a.y == c.y)
            return 1;
        if((a.x - b.x)*(a.y-c.y) == (a.y-b.y)*(a.x-c.x))
            return 1;
        return 0;
    }
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值