Leetcode OJ : Max Points on a Line

这道题的最直接思路就是枚举所有的点但是,问题是这样的时间效率就是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 };
好吧,这个递归的三目运算让我有点转不过来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值