二维平面上最多有多少个点在同一条直线上

思路一:两点确立一条直线,判断其余的点是否在直线上;时间复杂度o(n^3)

Submission Result: Time Limit Exceeded
int maxPoints(vector<Point> &points) {
    vector<Point> vi=points;
	int xi,yi;
	int xj,yj;
	unsigned int i,j,k;
	int num=0;
	int max=0;
	int temp1,temp2,temp3,temp4,temp5;
	if(vi.size()==0)
		return 0;
	else if(vi.size()>0&&vi.size()<=1)
		return 1;
	else if(vi.size()==2)
		return 2;

	for(i=0;i<vi.size();i++)
	{
		num=1;
		xi=vi[i].x;
		yi=vi[i].y;
		for(j=i;j<vi.size();j++,num=2)
		{
			if(j==i)
				continue;
			xj=vi[j].x;
			yj=vi[j].y;
			num=2;
			temp1=xj-xi;
			temp2=yj-yi;
			for(k=0;k<vi.size();k++)
			{
				if(k==i)
					continue;
				if(k==j)
					continue;

				//if(((yj-yi)*(vi[k].x-xi)/(xj-xi)+yi)==vi[k].y)
				//temp1=(yj-yi)*(vi[k].x-xi);
				if(temp1==0&&temp2==0)
				{
				    if(xj==vi[k].x)
				        {num++;
				        continue;}
				}
                else{
					temp3=temp2*vi[k].x+vi[i].y*vi[j].x-vi[j].y*vi[i].x;
					temp4=temp1*vi[k].y;
					if(temp3==temp4)
					num++;
                }


			}
			if(num>max)
				max=num;

		}
	}

	return max;
        
    }

思路二:记下任意两点的斜率(不要是整形,float或double ),找出最多能有多少个点斜率相同,
注意处理一些特殊情况,如斜率为正无穷,或存在相同的点对

accept代码:
int maxPoints(vector<Point> &points) 
{
	 int mx =1e10;
	size_t i,j;
	int xx,yy;
	int sam=0;
	int max_num=0;
	map<double,int> m;
	//m.clear();
	if(points.size()==0)
		return 0;
	else if(points.size()==1)
		return 1;
	else if(points.size()==2)
		return 2;


	for(i=0;i<points.size();i++)//如果vector中有三个以上的点
	{
		m.clear();
		sam=0;//用于记录有多少一样的点
		for(j=i;j<points.size();j++)
		{
			double k;
			xx=points[j].x-points[i].x;
			yy=points[j].y-points[i].y;
			if(xx==0&&yy==0)//两个点相同
				{
					sam++;
					continue;
				}
			else if(xx==0)//两点确立的直线平行于y轴,它的斜率为正无穷,用mx表示
				k=mx;
			else
				k=double(yy)/xx;//一般情况计算两点的斜率,注意区分k=double(yy/xx)

			m[k]++;

		}
		if(m.size()==0)
		{
			if(sam>max_num)
				max_num=sam;

			continue;
		}

		map<double,int>::iterator it=m.begin();//遍历m
		for(it;it!=m.end();it++)
		{
			if((*it).second+sam>max_num)
				max_num=(*it).second+sam;
		}
		
	}

	return max_num;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值