LeetCode Max Points on a Line 解题报告

44 篇文章 0 订阅
43 篇文章 0 订阅

Max Points on a Line 解题报告

http://oj.leetcode.com/problems/max-points-on-a-line/

给你一组点,求共线最多点的个数。

思路,暴力枚举,以每个“点”为中心,然后遍历剩余点,求出以i为起点j为终点的斜率(j>i),斜率相同的点一定共线。

对每个i,初始化一个哈希表,key 为斜率,value 为该直线上的点数。遍历结束后得到和当前i点共线的点的最大值,再和全局最大值比较,最后就是结果。

时间复杂度O(n2),空间复杂度O(n)。

其中有几点要注意的是: 存在坐标一样的点;存在斜率不存在的点(与x轴平行的直线)。

上AC代码:

    public static 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;
    }

在上几个测试用例:

        //Point[] array = { new Point(0,0)};
        //Point[] array = { new Point(0,0), new Point(0,0),new Point(0,0), new Point(0,0)};
        //Point[] array = { new Point(84,250), new Point(0,0) , new Point(1,0), new Point(0,-70), new Point(0,-70), new Point(1,-1), new Point(21,10), new Point(42,90),new Point(-42,-230)};
        //Point[] array = { new Point(0,0), new Point(0,1)};
        //Point[] array = { new Point(0,0), new Point(1,0)};
        //Point[] array = { new Point(1,1), new Point(1,2), new Point(1,3)};
        //Point[] array = { new Point(0,0), new Point(0,1), new Point(0,0)};
        //Point[] array = { new Point(2,3), new Point(3,3),new Point(-5,3)};
        Point[] array = {new Point(40,-23),new Point(9,138),new Point(429,115),new Point(50,-17),new Point(-3,80),new Point(-10,33),new Point(5,-21),new Point(-3,80),new Point(-6,-65),new Point(-18,26),new Point(-6,-65),new Point(5,72),new Point(0,77),new Point(-9,86),new Point(10,-2),new Point(-8,85),new Point(21,130),new Point(18,-6),new Point(-18,26),new Point(-1,-15),new Point(10,-2),new Point(8,69),new Point(-4,63),new Point(0,3),new Point(-4,40),new Point(-7,84),new Point(-8,7),new Point(30,154),new Point(16,-5),new Point(6,90),new Point(18,-6),new Point(5,77),new Point(-4,77),new Point(7,-13),new Point(-1,-45),new Point(16,-5),new Point(-9,86),new Point(-16,11),new Point(-7,84),new Point(1,76),new Point(3,77),new Point(10,67),new Point(1,-37),new Point(-10,-81),new Point(4,-11),new Point(-20,13),new Point(-10,77),new Point(6,-17),new Point(-27,2),new Point(-10,-81),new Point(10,-1),new Point(-9,1),new Point(-8,43),new Point(2,2),new Point(2,-21),new Point(3,82),new Point(8,-1),new Point(10,-1),new Point(-9,1),new Point(-12,42),new Point(16,-5),new Point(-5,-61),new Point(20,-7),new Point(9,-35),new Point(10,6),new Point(12,106),new Point(5,-21),new Point(-5,82),new Point(6,71),new Point(-15,34),new Point(-10,87),new Point(-14,-12),new Point(12,106),new Point(-5,82),new Point(-46,-45),new Point(-4,63),new Point(16,-5),new Point(4,1),new Point(-3,-53),new Point(0,-17),new Point(9,98),new Point(-18,26),new Point(-9,86),new Point(2,77),new Point(-2,-49),new Point(1,76),new Point(-3,-38),new Point(-8,7),new Point(-17,-37),new Point(5,72),new Point(10,-37),new Point(-4,-57),new Point(-3,-53),new Point(3,74),new Point(-3,-11),new Point(-8,7),new Point(1,88),new Point(-12,42),new Point(1,-37),new Point(2,77),new Point(-6,77),new Point(5,72),new Point(-4,-57),new Point(-18,-33),new Point(-12,42),new Point(-9,86),new Point(2,77),new Point(-8,77),new Point(-3,77),new Point(9,-42),new Point(16,41),new Point(-29,-37),new Point(0,-41),new Point(-21,18),new Point(-27,-34),new Point(0,77),new Point(3,74),new Point(-7,-69),new Point(-21,18),new Point(27,146),new Point(-20,13),new Point(21,130),new Point(-6,-65),new Point(14,-4),new Point(0,3),new Point(9,-5),new Point(6,-29),new Point(-2,73),new Point(-1,-15),new Point(1,76),new Point(-4,77),new Point(6,-29)};
        //最后一个测试用例是leetCode上面最难AC的一个数据,正确答案应该是25,小伙伴们AC了吗?
        System.out.println(LeetcodeMaxPointsOnALine.maxPoints(array));



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值