0
点赞
收藏
分享

微信扫一扫

【力扣刷题总结之149. 直线上最多的点数】

caoxingyu 2022-02-04 阅读 94

相关标签


一、题目要求

 二、题解和代码实现

1.题解

非官方题解

2.代码实现

代码如下(示例):

class Solution {
     public int maxPoints(int[][] ps) {
        int n = ps.length;
        int ans = 1;
        for (int i = 0; i < n; i++) {
            Map<String, Integer> map = new HashMap<>();
            // 由当前点 i 发出的直线所经过的最多点数量
            int max = 0;
            for (int j = i + 1; j < n; j++) {
                //x1 y1 是当前i下标的x和y,x2 y2 是从i下标后面的元素的x和y
                int x1 = ps[i][0], y1 = ps[i][1], x2 = ps[j][0], y2 = ps[j][1];
                int a = x1 - x2, b = y1 - y2;
                int k = gcd(a, b);//求出斜率
                String key = (a / k) + "_" + (b / k);//生成key
                map.put(key, map.getOrDefault(key, 0) + 1);//存进map
                max = Math.max(max, map.get(key));//得到该i下标 开始最多点数连成直线的最大个数
            }
            ans = Math.max(ans, max + 1);//和当前连成直线的最大个数相比,大者赋值到当前连成直线的最大个数(ans)
        }
        return ans;
    }
    int gcd(int a, int b) {//求斜率
        return b == 0 ? a : gcd(b, a % b);
    }
}
举报

相关推荐

0 条评论