博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode:Max Points on a Line
阅读量:6249 次
发布时间:2019-06-22

本文共 2227 字,大约阅读时间需要 7 分钟。

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

分析:首先要注意的是,输入数组中可能有重复的点。由于两点确定一条直线,一个很直观的解法是计算每两个点形成的直线,然后把相同的直线合并,最后包含点最多的直线上点的个数就是本题的解。我们知道表示一条直线可以用斜率和y截距两个浮点数(垂直于x轴的直线斜率为无穷大,截距用x截距),同时还需要保存每条直线上的点(避免重复)。听起来就很麻烦,但是基于这个思想有一种简单的实现方式:

  • 以某点O为中心,计算它和其他点的斜率,如果有两个点A、B和O点形成的斜率相等,那么ABO三点是共线的,如果有多个点和O的斜率相等,那么这多个点和O也是共线的,因此我们可以求出包含O的所有直线中点数最多的直线,会得到一个最大共线点数k(O),如果和O点重复的点有n个(除了O本身),那么K(O) = K(O) + n。这一步的计算中,为了提高效率,我们可以用哈希表来保存某个斜率对应的点的数目。
  • 对数组中的每一个点i,按照第一步计算得到每个点最大点数K(i)
  • 从k(i)中选取最大的就是本题的解
  • 注意:为了避免重复计算,以数组中第i个点为中心时,只计算数组中它右边的所有点                                                                                                                  
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
&points) {13 // IMPORTANT: Please reset any member data you declared, as14 // the same Solution instance will be reused for each test case.15 int len = points.size(), res = 1;16 if(len == 0)return 0;17 unordered_map
umap;18 for(int i = 0; i < len; i++)19 {20 umap.clear();21 int samePointNum = 0,tmpres = 1;22 for(int j = i+1; j < len; j++)23 {24 double slope = std::numeric_limits
::infinity();//斜率初始化为无穷大,我们视横坐标相同的两点间的斜率为无穷大25 if(points[i].x != points[j].x)26 slope = 1.0*(points[i].y - points[j].y) / (points[i].x - points[j].x);27 else if(points[i].y == points[j].y)28 {samePointNum++; continue;}29 int tmp;30 if(umap.find(slope) != umap.end())31 tmp = ++umap[slope];32 else 33 {34 umap.insert(unordered_map
::value_type(slope, 2));35 tmp = 2;36 }37 if(tmpres < tmp)tmpres = tmp;38 }39 if(res < tmpres + samePointNum)res = tmpres + samePointNum;40 }41 return res;42 }43 };

【版权声明】转载请注明出处:

转载于:https://www.cnblogs.com/TenosDoIt/p/3444086.html

你可能感兴趣的文章
intel笔记本cpu型号后缀详解(M,U,QM,MQ,HQ,XM)
查看>>
Iperf使用方法与参数说明
查看>>
【技术教程】MySQL to SequoiaDB数据迁移
查看>>
Citrix XenMobile学习笔记之六:XenMoble业务访问数据流程
查看>>
访问cacti的首页面为空白
查看>>
ssh不能登陆了,openssl库冲突
查看>>
Jenkins + maven + git 多环境自动化部署
查看>>
YII2 日志模块 之 使用数据库记录错误信息
查看>>
程序员的四个境界
查看>>
条款16:成对使用new和delete时要采取相同的形式
查看>>
LRU(Least Recent Used) java 实现为这么采用HashMap+双向链表
查看>>
Sendmail邮件服务器
查看>>
Server2008R2AD概念理解
查看>>
Java记录 -13- 面向对象之继承
查看>>
深浅拷贝问题
查看>>
MySql相关及如何删除MySql服务
查看>>
jdk future
查看>>
我的友情链接
查看>>
Jenkins插件安装及配置
查看>>
我的友情链接
查看>>