Leetcode刷题笔记:149. Max Points on a Line

题干:Given an array of points where points[i] = [xi, yi] represents a point on the X-Y plane, return the maximum number of points that lie on the same straight line.

Constraints: 

  • 1 <= points.length <= 300
  • points[i].length == 2
  • -104 <= xi, yi <= 104
  • All the points are unique

比较基础的一道hard题。首先考虑如何在二维坐标系确定一条无向直线,有两种思路:1、两点之间确定一条直线;2、点坐标+斜率。由两点组合确定的话数量会随点的个数上升而急剧增加且需要去重。这边考虑点坐标+斜率的方式确定直线。

由hashMap存储斜率+直线上点的个数,需要注意斜率需用double类型存储及边界条件:斜率为无穷大、double的0.0和-0.0。代码如下,供参考。

public static int maxPoints(int[][] points){
    int length = points.length;
    if (length==1) return 1;
    int maxpoints=-1;
    for (int i=0;i<length-1;++i){
        if (length-i<=maxpoints) break;
        Map<Double,Integer> line = new HashMap<>();
        int x0 = points[i][0];
        int y0 = points[i][1];
        for (int j=i+1;j<length;++j){
            int dx=points[j][0]-x0;
            int dy=points[j][1]-y0;
            double slope=Double.MAX_VALUE;
            if (dx!=0)
                slope=(double)dy/(double)dx;
            if (dy==0) slope=0;
            line.put(slope,line.getOrDefault(slope,1)+1);
            maxpoints=Math.max(maxpoints,line.get(slope));
        }
    }
    return maxpoints;
}

在这个思路下理解这道题其实难度够不上hard,但这个解法的时间空间复杂度都比较一般。

发散思维的话,有考虑过1、通过位图还原二维坐标图再BFS,2、DFS+剪枝的方法去解,但这两种在程序设计的难度上更大,欢迎有其他更优解法的朋友交流。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值