Max Points on a Line

Max Points on a Line 

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

/**
 * Definition for a point.
 * class Point {
 *     int x;
 *     int y;
 *     Point() { x = 0; y = 0; }
 *     Point(int a, int b) { x = a; y = b; }
 * }
 */
public class Solution {
    public int maxPoints(Point[] points) {
        if(points.length<=2) {  
        return points.length;  
    }  
    //斜率  
    double k = 0.0;  
    int maxPointNum      = 0;  
    int tempMaxPointNum  = 0;  
    //坐标完全相同点的个数  
    int samePointNum     = 0;  
    //与x轴平行  
    int parallelPointNum = 0;   
    HashMap<Double,Integer> slopeMap = new HashMap<Double,Integer>();  
    for(int i=0;i<points.length-1;i++) {  
        //代表起始点,会被累加上  
        samePointNum     = 1;  
        parallelPointNum = 0;   
        tempMaxPointNum  = 0;  
        slopeMap.clear();  
        for(int j=i+1;j<points.length;j++) {  
            //坐标完全相同  
            if((points[i].x == points[j].x)&&((points[i].y == points[j].y))) {  
                samePointNum++;  
                continue;  
            }  
            //与y轴平行  
            if(points[i].x == points[j].x) {  
                parallelPointNum++;  
            } else {  
                if(points[i].y == points[j].y) {  
                    k = 0;  
                } else {  
                    k = ((double)(points[i].y - points[j].y))/(points[i].x - points[j].x);  
                }  
                //斜率不存在  
                if(slopeMap.get(k)==null) {  
                    slopeMap.put(k, new Integer(1));  
                    if(1>tempMaxPointNum) {  
                        tempMaxPointNum = 1;  
                    }  
                }else {  
                    //斜率已存在  
                    int number = slopeMap.get(k);  
                    number++;  
                    slopeMap.put(k, new Integer(number));  
                    if(number>tempMaxPointNum) {  
                        tempMaxPointNum = number;  
                    }  
                }  
            }  
        } //end of for  
          
        if(parallelPointNum>1) {  
            if(parallelPointNum>tempMaxPointNum) {  
                tempMaxPointNum = parallelPointNum;  
            }  
        }  
        //加上起始点和具有相同坐标的点  
        tempMaxPointNum += samePointNum;  
        if(tempMaxPointNum>maxPointNum) {  
            maxPointNum = tempMaxPointNum;  
        }  
    }  
    return maxPointNum;  
    }
}


这是别人写的,自己之前思考的时候想的也是暴力破解方法,即利用斜率计算每一条直线上的点数,但是想想觉得不是很高效的算法,就一直想更好的算法思想,结果。。。。真是想多了!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值