首页 > 代码库 > LeetCode OJ - Max Points on a Line
LeetCode OJ - Max Points on a Line
题目:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
解题思路:
第一反应:枚举两个点组成的直线,然后看其他的点在不在这条直线上,在此过程中统计最大值。此思路的复杂度 O(n^3)
参考了网上的思路:枚举第一个点,用unordered_map来记录其余的点和这个点的斜率,若斜率相同则代表这些点在同一直线上。避免double问题,把斜率转化成化简的x、y组成字符串。(注意处理重复的点)
代码:
/** * Definition for a point. * struct Point { * int x; * int y; * Point() : x(0), y(0) {} * Point(int a, int b) : x(a), y(b) {} * }; */ class Solution { public: int maxPoints(vector<Point> &points) { int ans = 0; vector<Point>::iterator first, second; for (first = points.begin(); first != points.end(); first++){ map<string, int> record_map; int same_point = 0, tmp_ans = 0; for (second = first + 1; second != points.end(); second++){ int x = (*second).x - (*first).x, y = (*second).y - (*first).y; if (x==0 && y==0){ same_point ++; continue; } /*计算斜率*/ int g = gcd(x, y); if (g){ /*非同一个点*/ x = x / g; y = y / g; } string str_tmp = to_string(x) + " " + to_string(y); if (record_map.find(str_tmp) != record_map.end()){ record_map[str_tmp] += 1; } else{ record_map[str_tmp] = 1; } tmp_ans = max(tmp_ans, record_map[str_tmp]); } ans = max(tmp_ans + 1 + same_point, ans); } return ans; } private: int gcd(int x, int y){ if (y){ return gcd(y, x % y); } else{ return x; } } };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。