这题卡了好长时间,心态崩了呀,,,
最开始把斜率当作直线,我真是脑抽,表示一条直线用斜率 k + 截距 b 就可以了。
但是要注意,如果两点x值相等,那么我们斜率为正无穷,为了能表示不同的与x轴垂直直线,用x坐标表示一条与x轴垂直的直线;如果两点y值相等,那么我们的斜率为0,为了表示,则用y值表示不同的直线。
对于一般直线就用k b表示,题中的数据有坑的地方,两点相等也是同一条直线,我们用不同的下标区分坐标相同的点就可以了。
class Solution { public: int maxPoints(vector<vector<int>>& points) { if (points.size()==1||points.size()==0) return points.size(); vector<vector<int> >& p=points; map<long double,set<int> > x,y; map<pair<long double,long double>,set<int> > mp; int sz=points.size(); for (int i=0;i<sz;i++) { for (int j=i+1;j<sz;j++) { if (p[i][0]==p[j][0]) { x[p[i][0]].insert(i); x[p[i][0]].insert(j); } else if (p[i][1]==p[j][1]) { y[p[i][1]].insert(i); y[p[i][1]].insert(j); } else { long double k=(long double)(p[i][1]-p[j][1])/(long double)(p[i][0]-p[j][0]); long double b=p[i][1]-k*p[i][0]; mp[make_pair(k,b)].insert(i); mp[make_pair(k,b)].insert(j); } } } int ans=0; for (auto p: x) { int tmp=p.second.size();ans=max(ans,tmp); } for (auto p: y) { int tmp=p.second.size();ans=max(ans,tmp); } for (auto p: mp) { int tmp=p.second.size();ans=max(ans,tmp); } return ans; } };
原文地址:https://www.cnblogs.com/xyqxyq/p/12234018.html
时间: 2024-11-08 02:54:12