LeetCode Max Points on a Line

Q:

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

该题我的思路是两层循环,根据斜率来判断属于相同一条直线的点有多少个,如果说是在同一条直线上的那么一般在第一轮就得出这条直线所有的点的数量。除了基本思路之外,还需要考虑一些特殊情况,比如可能会输入一些重复的点,或者两个点组成的直线斜率无法计算等等,这些都要考虑进去。

代码:

class Solution{
public :
	int maxPoints(vector<Point> &points){
		map<double, int> countMap;		
		map<double, int>::iterator it;

		if(points.empty())return 0;

		int sameNum;		//可能有重复的点		
		int maxNum = 1;		//所有点中比
		int tmpMaxNum = 1;	//同一个点所有直线中含有最多的点的个数(同一个点中比)
		int numOfLine = 1;  //同一条横线上斜率无法表示,只有单独计数
		int temp;
		for(int i = 0; i < points.size(); i++){
			countMap.clear();
			sameNum = 0;
			numOfLine = 1;
			tmpMaxNum = 1;
			double xielv;
			for(int j = i + 1; j < points.size(); j++){
				if(i == 3)
				{
					xielv = 0;
				}
				bool flag = false;
				if(points[i].x == points[j].x && points[i].y == points[j].y)
				{
						sameNum++;
						continue;
				}
				if((points[j].x != points[i].x))
					xielv = (double)( points[j].y - points[i].y ) / (double)( points[j].x - points[i].x );
				else 
				{
					flag = true;		//不计算斜率
					numOfLine++;
				}
				it = countMap.find(xielv);
				if(!flag)				//计算斜率时
				{
					if(it != countMap.end())
					{
						temp = ++countMap[xielv];
					}
					else 
					{
						countMap[xielv] = 2;		//该斜率的直线上的点有2个
						temp = 2;
					}				
					if(tmpMaxNum < temp)tmpMaxNum = temp;	
				}
				if(tmpMaxNum < numOfLine)tmpMaxNum = numOfLine;
			}			
			if(maxNum < tmpMaxNum + sameNum)
			{				
				maxNum = tmpMaxNum + sameNum;
			}
		}
	
		return maxNum;
	}
};
如果大家有更好的思路,欢迎在评论中提出来,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值