leetcode 149:Max Points on a Line(java实现)细致分析

Given  n  points on a 2D plane, find the maximum number of points that lie on the same straight line.
Subscribe  to see which companies asked this question
题目分析:给定任意多个点,找到在一条线上最多的点。都知道两点构成一条直线,如果要求另一点也在这条直线上,那个这个点跟其中任何一个点的斜率必须要求一致。针对每个点,可以找到其他点跟它组成的直线中点最多的,跟它组成的直线,斜率一样的一定在一条直线上。这样复杂度为o(n^2)。
我们考虑对每个点,建一条斜率与点数的对应关系表,如果是竖着的直线,则斜率为无穷大。
需要特殊处理的情况如下:
1. 当没有点,或者只有一个点的时候,可以直接返回数组长度。

2.需要考虑重复点

3. 计算斜率的时候,需要指定一个方向,比如X大的作为被减数

4. 对于每个点,都要更新max

源代码如下:

  public int maxPoints(Point[] points) {
    	/**当没有点,或者只有一个点的时候,可以直接返回数组长度。*/
    	if(points.length<=1) return points.length;
    	int max=0;
    	int len=points.length;
    	for(int i=0;i<len;i++)
    	{
    		Map<Double,Integer> map=new HashMap<Double,Integer>();
    		int dup=1;/**当前点包含在内*/
    		for(int j=0;j<len;j++)
    		{
    			double k=0.0;
    			if(j==i) continue;
    			if(points[i].x==points[j].x)
    			{
    				/***考虑重复点*/
    				if(points[i].y==points[j].y)
    				{
    					dup++;
    					continue;
    				}
    				/**竖线斜率无穷大*/
    				else
    				{
    				     k=Double.MAX_VALUE;
    				}
    			}
    			else
    			{
    				if(points[i].x>points[j].x)
    					k=((double)(points[i].y-points[j].y))/(points[i].x-points[j].x);
    				else
    					k=((double)(points[j].y-points[i].y))/(points[j].x-points[i].x);
    				
    			}
    			if(map.containsKey(k))
    			{
    				map.put(k, map.get(k)+1);
    			}
    			else
    			{
    				map.put(k, 1);
    			}
    		
    		}
    		double key;
    		if(map.size()==0) max=max>dup?max:dup;
    		for(Double d:map.keySet())
    		{
    			max=max>dup+map.get(d)?max:dup+map.get(d);
    		}
    	}
    	return max;
        
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值