您的位置:首页 > 其它

LeetCode--max-points-on-a-line

2018-01-04 16:50 501 查看


题目描述

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

解题思路

这个题比较简单,主要思想简单讲是找斜率相同的点。具体说就是以一个点为基准,与其他所有点计算斜率,找到与这点斜率相同的各个点,得到一条直线的最多点。 

需要两层循环: 

第一层,遍历参考点。 

第二层,除了参考点外的所有点,与参考点进行斜率的计算,存储斜率相同的点的数量。

比较每个参考点中最多点数,找到最大的。

/**
* 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) {
if (points.size()<=0)
return 0;//点集为空
if (points.size()==1)
return 1;//点集中只有一个点

int res=0;//定义好结果
for(int i=0;i<points.size();i++){//i为当前参考点
int vcnt=0,dup=0,curmax=1;//垂直的一条线的点,重合的点,当前的共线点的最大值
double delta_x=0,delta_y=0,k=0.0;
map<double,int>mp;//哈希表存储相同斜率的点的数量
for(int j=0;j<points.size();j++){
if (j!=i){
delta_x=points[i].x-points[j].x;
delta_y=points[i].y-points[j].y;
if (delta_x==0&&delta_y==0){//重合点
dup++;
}
else if (delta_x==0){//垂直线上的点
if (vcnt==0)
vcnt=2;
else vcnt++;
curmax=max(vcnt,curmax);
}
else {
k=delta_y/delta_x;
if (mp[k]==0)
mp[k]=2;
else mp[k]++;
curmax=max(mp[k],curmax);
}
}
}
res=max(res,curmax+dup);//重合点要加载结果中
}
return res;
}
};

易错点

特殊关系

1.两点在垂直坐标轴的线上时,斜率是不存在的。需要单独考虑。 

2.几个点重合在点集中也是算多个元素的,需要单独讨论。于是标记dup为是否与参考点重合,以便在算后面斜率相同时加上dup。

初始化位置

1.curmax初始化是在第一层循环初始化的,故每有一个新的i,即新的参考点的时候就会重新初始化curmax。如果在循环外初始化的话,前面一个点的参考点的curmax如果大于后面一个参考点的,而后面又有重合点dup的时候,会得到 res=前一个curmax+后一个dup的结果,这个结果显然是不对的。 

2.哈希表的初始化是在第一层循环之后的,也就是说每个参考点有一个哈希表来存储。这样使得都是以参考点为基准比较,直接用斜率会出现几组点斜率相同平行但不共线的情况。

转自http://m.blog.csdn.net/u010773275/article/details/70145209
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: