LeetCode problem 3: Max Points on a Line

思路: 这道题目刚开始的思路就是霍夫变换,但是发现无法累计参数空间的点数(至少我没想到相应的方法,因为直线的斜率不一定是整数),根据霍夫变换中的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。

你可能感兴趣的:(LeetCode problem 3: Max Points on a Line)