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; };
我身后空无一人,我怎敢倒下