[leetcode]Max Points on a Line

Max Points on a Line

Difficulty:Hard

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

题目就是给定一堆点,判断最多有多少点共线。

我的做法是先算数两两点之间的线段一次方程,然后通过判断相同的方程个数来判断共线的点数。

要注意的是,相同的方程数不等于共线点数,等于的是共线点之间的全连接,也就是完全图中的线的数量,比如共线点数为3,则相同方程为3,共线点数为4,则相同方程为6,也就是n(n-1)/2,n就是共线点数。同时还要注意精度的问题,精度要求高的地方使用long double类型。

 int maxPoints(vector<Point>& points) {
     if (points.size() <= 1)
		 return points.size();
	//设方程为y=kx+c
	 vector<pair<pair<int,  long double>,  double>> line;//记录两两点之间的方程 int记录方程是否与x轴垂直 long double为k double为c
	 int result = 0;
	 for (int i = 0; i<points.size(); i++){
		 for (int j = i + 1; j<points.size(); j++){

			 Point p1 = points[i];
			 Point p2 = points[j];
			 if ((p2.x - p1.x) != 0){//判断是否与x轴垂直
				 long double k = (p2.y - p1.y) / (long  double)(p2.x - p1.x);
				  double c = p2.y - ( double)(k*p2.x);
				 char s[20];
				 double dRetval;
				 sprintf(s, "%.*lf", 5, c);//c保留5位小数
				 sscanf(s, "%lf", &dRetval);
				 c = dRetval;
				 pair<int, long double> part(0, k);
				 pair<pair<int, long double>, double> perLine(part, c);
				 line.push_back(perLine);
			 }
			 else{
				 pair<int, long double> part(1, 0);
				 pair<pair<int, long double>, double> perLine(part, p1.x);
				 line.push_back(perLine);
			 }
		 }
	 }
	 vector<pair<pair<int, long double>, double>> uLine;
	 uLine.assign(line.begin(), line.end());
	 //sort(uLine.begin(), uLine.end());
	 uLine.erase(unique(uLine.begin(), uLine.end()), uLine.end());//去除重复

	 for (int i = 0; i<uLine.size(); i++){//判断有多少重复的方程 找出最大的重复次数
		 int tmpResult = 0;
		 for (int j = 0; j<line.size(); j++){
			 if (uLine[i] == line[j])
				 tmpResult++;
		 }
		 if (tmpResult>result)
			 result = tmpResult;
	 }
         //通过n(n-1)/2=result,解出n
		 int drt = 1 + 8 * result;
		 result = ceil((sqrt(drt) + 1) / 2);
	 return result;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值