149Max Points on a Line
来源:互联网 发布:fpga经典书籍 知乎 编辑:程序博客网 时间:2024/05/19 03:19
149 Max Points on a Line
链接:https://leetcode.com/problems/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.
Hide Tags Hash Table Math
这个问题就是求给出一些点的坐标,求在同一条直线上最多有几个点。直线表达式为y=kx+b,简单的解法就是遍历,取一个点p1,求出和其他点的斜率,如果斜率相同,那么这些点一定在同一直线上。需要注意的是斜率可能不存在情况。还有可能有和p1相同的点。自己用vector记录k和同线的点的数目不仅写代码比较麻烦,还不容易理解。
struct data { double k; int numofpoint; };class Solution {public: int maxPoints(vector<Point>& points) { if(points.size()<3) return points.size(); int result=0,numofsamepoint=0; vector<data> m; data temp; for(int i=0;i<points.size();i++) { for(int j=i+1;j<points.size();j++) { if(points[i].x==points[j].x&&points[i].y==points[j].y) { numofsamepoint++; continue; } else if(points[i].x==points[j].x) { temp.k=INT_MAX; temp.numofpoint=2; if(m.size()==0) m.push_back(temp); else for(int k=0;k<m.size();k++) { if(m[k].k==INT_MAX) { m[k].numofpoint++; break; } if(k==m.size()-1) { m.push_back(temp); break; } } } else { temp.k=double(points[i].y-points[j].y)/double(points[i].x-points[j].x); temp.numofpoint=2; if(m.size()==0) m.push_back(temp); else for(int k=0;k<m.size();k++) { if(m[k].k==temp.k) { m[k].numofpoint++; break; } if(k==m.size()-1) { m.push_back(temp); break; } } } } result= result>numofsamepoint+1?result:numofsamepoint+1; for(int k=0;k<m.size();k++) if(m[k].numofpoint+numofsamepoint>result) result=m[k].numofpoint+numofsamepoint; m.clear(); numofsamepoint=0; } return result; }};
用C++的unordered_map可以更好的解决这个问题。
class Solution {public: int maxPoints(vector<Point>& points) { if(points.size()<3) return points.size(); int result=0,numofsamepoint=1; unordered_map<float,int> m; for(int i=0;i<points.size();i++) { for(int j=i+1;j<points.size();j++) { if(points[i].x==points[j].x&&points[i].y==points[j].y) { numofsamepoint++; continue; } else m[points[i].x == points[j].x ? INT_MAX : (float)(points[j].y - points[i].y)/(points[j].x - points[i].x)]++; } result= result>numofsamepoint?result:numofsamepoint; unordered_map<float, int>::iterator it = m.begin(); for(; it != m.end(); it++) if(it->second + numofsamepoint > result) result=it->second + numofsamepoint; m.clear(); numofsamepoint=1; } return result; }};
0 0
- LeetCode(149)Max Points on a Line
- LeetCode: Max Points on a Line [149]
- 149Max Points on a Line
- LeetCode # 149 Max Points on a Line
- leetcode 149: Max Points on a Line
- LeeCode(149) Max Points on a Line
- 149、Max Points on a Line (Hard)
- Leetcode 149 Max Points on a Line
- LeetCode 149 Max Points on a Line
- 149 Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points on a Line
- Max Points On a Line
- Max Points on a Line
- vs2010断点无效
- 用户界面View之ViewFlipper
- IP地址判断有效性
- c#的List
- 第六章
- 149Max Points on a Line
- 第12周项目3-日期时间类
- Xib的两种加载方式,与xib建立关系的两种方式
- Set集合
- 十一周——继承与派生——项目四 圆的关系
- javaNIO原理(含代码)及与 同步阻塞IO 、伪异步IO比较
- 在HQL中使用单个的模糊查询,以及对于多个查询条件进行查询的话
- Layout_weight属性完全解析与使用ListView来实现表格
- 算法如何学