每天一道LeetCode-----平面上n个点,计算最多有多少个点在一条直线上
2018-02-04 22:32
459 查看
Max Points on a Line
原题链接Max Points on a Line![](https://s1.ax1x.com/2018/02/04/9uicfe.png)
给出2D平面中的n个坐标点,计算最多有多少个点在一条直线上
一条直线可以用斜率表示,即如果已知(x1,y1),(x2,y2)(x1,y1),(x2,y2),那么斜率为(y2−y1)/(x2−x1)(y2−y1)/(x2−x1) ,所以固定一个点,然后遍历其他点,将不同的斜率到个数的映射记录在map中,然后求最大的
思路是这样,但是由于浮点数计算有误差,导致斜率的计算不是准确的,所以不能直接记录斜率。因为斜率是由Δy/ΔxΔy/Δx计算得到的,那么可以采用<Δx,Δy><Δx,Δy>到个数的映射,不过需要将Δx,ΔyΔx,Δy化为最简的形式,这样,就可以将<Δx,Δy><Δx,Δy>这个数值对相等看成是斜率相等
化为最简的方法是找到两个数的最大公约数,使用辗转相除法,计算步骤是
用第一个数除以第二个数得到余数
如果余数为0,则第二个数就是最大公约数,返回
否则,用第二个数除以余数,回到步骤1(即将第二个数作为新的第一个数,将余数作为新的第二个数)
另外需要注意的一点是坐标点可能存在重合的情况
代码如下
/** * 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 count = 0; for(int i = 0; i < points.size(); ++i) { /* 固定points[i],遍历其他点,记录不同斜率个数,找最大的 */ std::map<std::pair<int, int>, int> m; int cnt = 0; int samePointCnt = 0; for(int j = i + 1; j < points.size(); ++j) { /* 记录重合点 */ if(points[i].x == points[j].x && points[i].y == points[j].y) ++samePointCnt; else { int xDiff = points[i].x - points[j].x; int yDiff = points[i].y - points[j].y; /* 计算最大公约数 */ int g = gcd(xDiff, yDiff); xDiff /= g; yDiff /= g; /* 添加到map中 */ cnt = std::max(cnt, ++m[std::make_pair(xDiff, yDiff)]); } } count = std::max(count, cnt + samePointCnt + 1); } return count; } private: int gcd(int a, int b) { if(b == 0) return a; else return gcd(b, a % b); } };
这里之所以用map而不用unordered_map是因为std::pair没有hash函数,所以如果要使用后者,就需要自己实现hash函数
相关文章推荐
- 每天一道LeetCode-----计算从二维数组的左上角到达右下角的所有路径数及最短的那条,如果存在障碍物时又是多少
- 每天一道LeetCode-----计算一个直方图空隙的容量(如果装水能装多少)
- 分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
- 每天一道LeetCode-----给定二维数组代表海域和岛屿,计算有多少个孤岛
- [leetcode] Max Points on a Line 判断最多有多少个点在同一条直线上
- 分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
- 二维平面上最多有多少个点在同一条直线上
- 每天一道LeetCode-----计算n的阶乘末尾有多少个0
- 【LeetCode141-150】链表环,先序后序遍历(迭代非递归),LRU内存,一条直线上最多多少点,stack经典题
- 每天一道LeetCode-----将数字集转成字母集,计算有多少种转换方式
- 分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
- LeetCode | 149. Max Points on a Line求多个点里面在一条直线上的点最多有多少个难题
- 每天一道LeetCode-----数组序列,每个元素的值表示最多可以向后跳多远,计算最少跳多少次可以到达末尾
- 每天一道LeetCode-----计算字符串s中有多少个子序列和字符串t相等
- 解题报告:最多有多少个点在一条直线上
- 每天一道LeetCode-----计算两个序列最长的公共子序列长度
- 最多有多少个点在一条直线上
- n条直线最多能将一个平面分成多少部分?
- 平面上画n条直线,最多能将平面分成多少部分?
- 最多有多少个点在同一条直线上