149. 直线上最多的点数

给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

示例 1:

输入: [[1,1],[2,2],[3,3]]
输出: 3
解释:
^
|
|        o
|     o
|  o  
+------------->
0  1  2  3 4
示例 2:

输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出: 4
解释:
^
|
| o
|     o   o
|      o
|  o   o
+------------------->
0  1  2  3  4  5  6

 

特判有点多,n^2暴力就行了,通过xx/gcd(xx,yy),yy/gcd(xx,yy)能识别唯一的一条直线,和x,y平行的特判下,与i点重合的特判下就可以拉

class Solution {
public:
    int maxPoints(vector<vector<int>>& points) {
        if(!(int)points.size())return 0;
        mp.clear();
        flag.clear();
        int ans(0);
        bool flg = 1;
        for(int i=0;i<points.size();++i){
            int zero=0;  
            for(int j=i+1;j<points.size();++j){
                int x=points[i][0],y=points[i][1],
                xx=points[j][0],yy=points[j][1];
                yy-=y,xx-=x;
             //   cout<<xx <<' '<<yy<<endl;
                if(xx==0&&yy==0){zero++;continue;}
                if(!yy){flag[1]++;ans=max(ans,flag[1]);continue;}
                if(!xx){flag[2]++;ans=max(ans,flag[2]);continue;}
                int t=__gcd(xx,yy);
                xx/=t,yy/=t;
                mp[make_pair(xx,yy)]++;
                if(ans<mp[make_pair(xx,yy)])flg=1;
                ans=max(ans,mp[make_pair(xx,yy)]);
            }
            if(flg)ans+=zero,flg=0;
            mp.clear();
            flag.clear();
        }
        return ans+1;
    } 
    map<pair<int,int>,int>mp;
    map<int,int>flag;
};

 

posted @ 2020-04-06 13:28  Xzavieru  阅读(146)  评论(0编辑  收藏  举报