思路: 这道题目刚开始的思路就是霍夫变换,但是发现无法累计参数空间的点数(至少我没想到相应的方法,因为直线的斜率不一定是整数),根据霍夫变换中的p和\theta也不好设计,所以,放弃了这一思路。后来根据别人的一些想法,统计每个点i所在的直线中,包含点数最多的直线k(i),然后取一个整体最大值max{k(i)},i = 1,...,n,得到最后的结果,需要注意的是,计算斜率的时候一定要注意浮点数和整数的转化,刚开始我没注意这个问题,导致精度下降,统计出现误差,调试了很久,这么简单的bug!!!郁闷……
/**
* 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) {
double k;
int max_all_num = 0;
for(vector<Point>::iterator it = points.begin();it != points.end();it++){
int max_k = 0; // 记录最大斜率的点数
int same_num = 0; //记录相同点的数目
map<double,int> num;
int x = (*it).x, y = (*it).y;
int mmmm = 0;
for(vector<Point>::iterator it2 = points.begin();it2 != points.end();it2++){
int x2 = (*it2).x, y2 = (*it2).y;
if(x2 != x){
k = (y2 - y)*1.0 / (1.0*(x2 - x));
num[k]++;
}
else if(y2 != y)
max_k++;
else
same_num++;
}
int max_num = 0;
for(map<double,int>::iterator it2 = num.begin();it2 != num.end();it2++){
max_num = max_num > it2->second ? max_num : it2->second;
}
max_num = max_num > max_k? max_num : max_k;
max_num = max_num + same_num;
max_all_num = max_all_num > max_num ? max_all_num : max_num;
}
return max_all_num;
}
};
欢迎指正bug。