Max Points on a Line
来源:互联网 发布:json key 排序 编辑:程序博客网 时间:2024/05/27 00:31
题目149: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.
题目分析:
计算在在一条直线上的点最多的个数。
两个不同的点A、B确定一条直线,这是显然的,如何判断第三个点C,在这两个点确定的一条直线上,如果A和C的斜率等于A和B的斜率,则C在A和B确定的直线上。
好了,该题有思路了,参考[2]思路写的清晰,参考[1]代码写的清晰,是我的喜欢的风格,希望自己代码也可以写的这么清晰。
思路分析:
- 以某点O为中心,计算它和其他所有点的斜率,如果直线OA的斜率等于直线OB的斜率,则OAB三点公线,求出包括O点的直线上包含点最多的个数K(O);
- 再依次求出包含剩余点的直线上包含点最多的个数,取最大值得出结果,时间复杂度是O(N^2)。
- 因为每次求斜率都要比较是否有相等的斜率,再修改统计的个数,所以为了效率,可以采用哈希表来保存斜率值,unordered_map< float slope, int count>。
- 如果有重复的点,要统计重复的点的个数dup,则实际在同一条直线上点的个数是K(O) + dup。
这里为了避免重复计算,以数组中第i个点为中心时,只计算数组中它右边的所有点(为什么这么做对,因为只求max,max肯定也是大于前面求过的值的)
代码如下:
/** * 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 len = points.size(); /* 注释(1) */ if (len <= 2) return len; int max = 0; unordered_map<float, int> mp; for (int i = 0; i < len; i ++) { mp.clear(); /* 注释(2) */ int dup = 1; /* 注释(3) */ mp[INT_MIN] = 0; for (int j = i + 1; j < len; j ++) { if (points[i].x == points[j].x && points[i].y == points[j].y) { ++ dup; continue; } /* 注释(4) */ float slope = (points[i].x == points[j].x) ? INT_MAX : (float)(points[i].y - points[j].y) / (points[i].x - points[j].x); mp[slope] ++; } unordered_map<float, int>::iterator iter = mp.begin(); for (; iter != mp.end(); iter ++) if (iter->second + dup > max) max = iter->second + dup; } return max; }};
注释:
(1)如果点数少于2个,直接返回点的个数,两个点才可以确定一条直线;
(2)dup为什么初始化是1,这个如果是3个点时,两个点重复,应该返回3,如果dup初始化是0,则返回2,错误,因为两个点确定一条直线,少算了当前点;
(3)mp[INT_MIN],如果都是重复的点,则mp是空,iter是空,返回max是0,错误;
(4)斜率是无穷大还是正常取值;
参考:
[1] http://blog.csdn.net/doc_sgl/article/details/17103427
[2] http://www.cnblogs.com/TenosDoIt/p/3444086.html
0 0
- 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
- 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
- 四川大学图书馆数据库
- 【黑马程序员】【OC语言】self关键字
- yii2 刷新页面
- spring读写分离 - 事务配置篇(转)
- Struts2-配置struts.xml
- Max Points on a Line
- markdown编辑器使用
- android 的 Testing Support Library 测试支持包(库)
- TCP和UDP
- iOS_开发_工具_mac下加密文件
- Swift学习 类、属性、方法的介绍
- 【特种兵PPT教程】如何巧用SmartArt设计自己想要的图表?
- 【黑马程序员】【OC语言】继承
- vert.x中的buffer简介