支线任务六
题目:Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
给出一系列点,求出点的个数最多的那条直线。
两点确定一条直线,N个点就有N(N-1)/2条直线,相同直线数最多的在这条直线上点数就最多。另一个角度,一个点加一个斜率确定一条直线,相对于同一点dy/dx相同的点必定在同一条直线上。而且对于某一个点,另一个点与它的关系有三种,重合,dy/dx为正无穷,dy/dx为有限值。想明白了这些题目就变得很简单了。
class Solution { public: int maxPoints(vector<Point>& points) { int n = points.size(); if(n<3) return n; int result = 0; map<float,int> m; for(int i=0;i<n;i++) { int duplicate = 1; for (int j=i+1; j<n; j++) { if(points[j].x==points[i].x && points[j].y==points[i].y) duplicate++;//计算重合的点 else if(points[j].x==points[i].x) m[INT_MAX]++;//斜率为无穷大的点 else { float k = (float)(points[j].y-points[i].y)/(points[j].x-points[i].x); m[k]++; } } result=max(result,duplicate);//如果所有点都重合,map为空 for(map<float,int>::iterator it=m.begin();it!=m.end();it++) result = max(result,it->second+duplicate); m.clear(); } return result; } };
运行结果:Runtime: 24 ms