题目
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) {
int max=0; //最大点数
for(int i=0;i<points.size();i++){ //遍历所有点,求任意两点间的斜率
int dup=0; //重复点数
int vert=1; //垂直点数
map<double,int> grad; //记录本次循环的斜率和对应的点数
for(int j=0;j<points.size();j++){
if(i==j) continue; //相同点过滤
if(points[j].y==points[i].y){
if(points[j].x==points[i].x)
dup++; //重复点
else
vert++; //垂直点
}
else{
//计算斜率
double cur_grad=(double)(points[j].x-points[i].x)/(double)(points[j].y-points[i].y);
map<double,int>::iterator it=grad.find(cur_grad);
if(it!=grad.end()) (it->second)++;
else grad.insert(make_pair(cur_grad,2));
}
}
//更新点数最大值
if(vert+dup > max) max=vert+dup;
for(map<double,int>::iterator it=grad.begin();it!=grad.end();it++){
if(it->second+dup > max) max=it->second+dup;
}
}
return max;
}
};