这道题的最直接思路就是枚举所有的点但是,问题是这样的时间效率就是O(n^3)显然和太低效率。
最后在:http://www.cnblogs.com/CSGrandeur/p/3520937.html看到了这个思路
平面上一条直线最多穿过多少点。乍一看好熟悉的问题,做了这么久计算几何。。。却还真没做过这个小问题。
第一反应当然不能O(n^3)枚举了,枚举圆周好像也不行,毕竟是考察所有点,不是某个点。那么应该就是哈希斜率了吧。
肯定少不了竖直的线,哈希斜率这不像是这类OJ让写的题吧。。忘了map这回事了。
确定思路之后,还是看看别人博客吧,少走点弯路,然后就学习了还有unordered_map这么个东西,还有一个博客的思路挺好,避免double问题,把斜率转化成化简的x、y组成字符串。
再另外就是重叠的点了,想让题目坑一点,怎能少得了这种数据,单独处理一下。
1 /** 2 * Definition for a point. 3 * struct Point { 4 * int x; 5 * int y; 6 * Point() : x(0), y(0) {} 7 * Point(int a, int b) : x(a), y(b) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 int maxPoints(vector<Point> &points) { 13 int ans = 0; 14 for(int i = 0; i < points.size(); i ++) 15 { 16 unordered_map<string, int> mp; 17 int tmpans = 0, same = 0; 18 for(int j = i + 1; j < points.size(); j ++) 19 { 20 int x = points[j].x - points[i].x, y = points[j].y - points[i].y; 21 int g = gcd(x, y); 22 if(g != 0) x /= g, y /= g;//化成最简式 23 else {same ++; continue;} 24 if(x < 0) x = -x, y = -y; 25 string tmp = to_string(x) + " " + to_string(y); 26 if(!mp.count(tmp)) mp[tmp] = 1; 27 else mp[tmp] ++; 28 tmpans = max(tmpans, mp[tmp]); 29 } 30 ans = max(tmpans + 1 + same, ans); 31 } 32 return ans; 33 } 34 int gcd(int a, int b)//最大公约数 35 { 36 return a ? gcd(b % a, a) : b; 37 } 38 };
好吧,这个递归的三目运算让我有点转不过来