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;
    }
};




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章