目标:求平面上在一条直线上最多的点的个数
首先想到了多点共线的规律就是两两之间的斜率相同,提到斜率又要考虑到斜率不存在的情况,即求斜率公式的分母为0.然而这边也存在两种情况,一个就是真的斜率不存在,另外一个就是两个点是相同的,这样的话也是无法计算斜率的,这两点都要考虑到。代码的主要部分就是一个二重循环,第一重循环式选取初始点,第二重循环遍历其他点,找出与初始点共线最多的点。
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){
map<float, int> q;
int maxnum=0;
for(size_t i=0;i<points.size();i++){
q.clear();
q[INT_MIN]=0;
int error_rate_num=0;
int same_num =1;
int a = points[i].x;
int b = points[i].y;
for(size_t j=0;j<points.size();j++){
if(i==j)
continue;
if(points[j].x == a&&points[j].y != b){
q[INT_MIN]++;
}
else if(points[j].x==a&&points[j].y==b)
same_num++;
else{
float rate = (points[j].y-b)/float(points[j].x-a);
if(q.find(rate)==q.end()){
q.insert(map<float,int>::value_type(rate,1));
}
else
q[rate]++;
}
}
for(map<float,int>::const_iterator it =q.begin();it!=q.end();it++){
if((it->second+same_num) > maxnum)
maxnum = it->second+same_num;
}
}
return maxnum;
}
};
代码中same_num表示与初始点相同的点,这边我设置初始值为1,就是把初始点本身当做了与之相同的点,这样也就同时考虑到了只有一个点的情况.