您的位置:首页 > 其它

LeetCode:Max Points on a Line

2014-03-24 14:47 323 查看
这道题想法比较中规中矩,只要遍历每一个点,每点与其他点做连线,斜率一样就好。

但是这题有很多陷阱,比输入为空,出入很多重复点,重复点是不能算斜率无穷或0,但是所以通过的直线计算点数都要加上重复点。还有斜率问题,在计算K时要进行强制类型转换。

/**
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
const double INF=1E9;
class Solution {
public:
int maxPoints(vector<Point> &points) {
unordered_map<float,int> mp;
int maxNum=1;
int dup=0;
if(!points.size()){ //防止输入为空
return 0;
}
for(int i=0;i<points.size();i++){
dup=0;
int ans=1;
mp.clear(); //每循环一次mp,dup,ans重置
for(int j=0;j<points.size();j++){
if(i==j)continue; //相同点跳过
if(points[i].x==points[j].x&&points[i].y==points[j].y){
dup++; //重合点,计数器加一
continue;
}
if(points[i].x==points[j].x){
if(mp.find(INF)==mp.end()){ //如果map里没有INF,则初始化为2个点
mp[INF]=2;
}
else
mp[INF]++; //如果map里有INF,则mp[INF]++
ans=max(ans,mp[INF]);
}else{
float k=(float)(points[i].y-points[j].y)/(points[i].x-points[j].x); //要有(float)强制类型转化,不然会WA
if(mp.find(k)==mp.end())
mp[k]=2;
else
mp[k]++;
ans=max(ans,mp[k]);
}

}
maxNum=max(maxNum,ans+dup);

}
return maxNum;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: