LeetCode OJ:Max Points on a Line

Max Points on a Line

  Total Accepted: 3110  Total Submissions: 31616 My Submissions

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


算法思想:

对于节点序列points,对于每一个节点,从它的后一个节点开始往后遍历,与当前节点斜率相同的放一组,遍历完找到与当前节点相连最多的那一组元素个数作为过当前节点一条线上的最多点数。

有几点注意事项:1、垂线的处理,这里可以用PI(3.1415926)来表示(因为只要是斜率必然是有限小数或者无限循环小数,况且这些都是整数点)2、相同的点的处理

3、需要一些剪枝,否则会TLE,把一些不可能情况排除,比如说对于序列<1,2,3,4,5,6,7>,这七个点,如果我们已经找到3个点在一条线上,那么我们就没必要对5,6,7这3个点往后遍历找最长的点个数了,因为对于5来说最多也只能有3个点在一条线上(5,6,7而已)

/**
 * Definition for a point.
 * struct Point {
 *     int x;
 *     int y;
 *     Point() : x(0), y(0) {}
 *     Point(int a, int b) : x(a), y(b) {}
 * };
 */
#include <map>
#include <cmath>
#define PI 3.1415926
class Solution {
public:
    int maxV(map<double,int> t){
		int v=0;
		map<double,int>::iterator it;
		for(it=t.begin();it!=t.end();it++){
			v=v<it->second?it->second:v;
		}
		return v;
	}
	int maxPoints(vector<Point> &points){
		int maxP=0;
		for(int i=0;i<points.size()-maxP;i++){
			int con=0;
			map<double,int> m;
			map<double,int>::iterator it;
			for(int j=i+1;j<points.size();j++){
				int x=points[i].x-points[j].x;
				int y=points[i].y-points[j].y;
				double k;
				if(x==0&&y==0){
					con++;
					continue;
				}
				if(x==0){
					k=PI;
				}
				else k=y*1.0/x;
				//cout<<k<<endl;
				it=m.find(k);
				if(it!=m.end()){
					it->second++;
				}
				else {
					m.insert(pair<double,int>(k,1));
				}
			}
			maxP=maxP<1+con+maxV(m)?1+con+maxV(m):maxP;
		}
		return maxP;
	}
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值