题意:给定n个二维平面上的点,找到某条直线让该直线穿过的点最多,并求出点的个数。
我的想法:
固定两个点作为一条直线,然后遍历其他的点看是否在这条直线上,一边遍历一边记录。最后把该直线上的点数和之前的最大点数进行比较,并取较大者。然后取下一条直线进行相同的操作,但要注意重复的情况,不然会超时。
思路很简单,三个循环便可以完成,时间复杂度达到了n^3。
贴上代码:
class Solution { public: int maxPoints(vector<Point>& points) { int maxNum = 0; if(points.size() < 3)return points.size(); for(int i = 0;i < points.size();i++) { for(int j = i + 1;j < points.size();j++) { int temMax = 2; while(points[j].x == points[i].x && points[j].y == points[i].y) //固定的两个点相同,则继续往下取,而且temMax加一 { j++; if(j == points.size()) break; temMax++; } for(int k = j + 1;k < points.size();k++) { if(points[k].x == points[i].x && points[k].y == points[i].y) temMax++; else if(points[k].x == points[j].x && points[k].y == points[j].y) temMax++; else if(getK(points[i], points[k]) == getK(points[i], points[j])) temMax++; } if(temMax > maxNum) maxNum = temMax; } } return maxNum; } private: double getK(Point a, Point b) { if(a.x == b.x)return MAX_INPUT; double k; k = (double)(a.y - b.y)/(double)(a.x - b.x); return k; } };
需要注意的地方:
1、提交了之后才发现给的测试用例里面有重复的点,大家记得处理这种情况;
2、处理斜率不存在的情况;
3、点的个数小于3时直接输出