Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

目标:求平面上在一条直线上最多的点的个数

 首先想到了多点共线的规律就是两两之间的斜率相同,提到斜率又要考虑到斜率不存在的情况,即求斜率公式的分母为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,就是把初始点本身当做了与之相同的点,这样也就同时考虑到了只有一个点的情况.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值