149. 直线上最多的点数

https://leetcode.cn/problems/max-points-on-a-line/?envType=study-plan-v2&envId=top-interview-150

我们可以通过斜率 + 出发点位置来判断多个点是否位于同一条直线,遍历所有点依次选取作为出发点然后遍历其它点计算斜率,并且通过hashmap来记录斜率出现的次数,对于水平线和竖直线我们可以单独拿出来统计,最后比较得出三种情况的最大值。

java 复制代码
    public int maxPoints(int[][] points) {
        int n = points.length;
        if (n <= 2) {
            return n;
        }
        int res = 0;
        for (int i = 0; i < n; i++) {
            HashMap<Double, Integer> map = new HashMap<>();
            int row = 1, col = 1; // 记录水平线和竖直线
            int max = 0; // 记录斜率出现次数的最大值
            for (int j = i + 1; j < n; j++) {// 遍历其它点
                if (points[i][0] == points[j][0]) {
                    col++;
                    continue;
                }
                if (points[i][1] == points[j][1]) {
                    row++;
                    continue;
                }
                // 斜线情况
                double k = (double) (points[i][1] - points[j][1]) / (points[i][0] - points[j][0]);
                if(!map.containsKey(k)) {
                    map.put(k, 2);
                } else {
                    map.put(k, map.get(k) + 1);
                }
                max = Math.max(max, map.get(k));
            }
            max = Math.max(max, Math.max(row, col));
            res = Math.max(res, max);
        }
        return res;
    }

我们还可以使用向量叉积来判断是否共线,向量共线条件:dx1 * dy2 == dx2 * dy1

java 复制代码
    public int maxPoints(int[][] points) {
        int n = points.length;
        if(n <= 2) return n;
        int res = 2;
        // 因为points的长度比较小,三层for可以接受
        for(int i = 0; i < n; i++) {
            for(int j = i + 1; j < n; j++) {
                // 选取两个点计算向量
                int x1 = points[i][0], y1 = points[i][1];
                int x2 = points[j][0], y2 = points[j][1];
                int max = 2;
                // 计算向量
                int dx1 = x2 - x1, dy1 = y2 - y1;
                // 找第三点
                for(int k = j + 1; k < n; k++) {
                    // 计算第一点和第三点向量
                    int dx2 = points[k][0] - x1, dy2 = points[k][1] - y1;
                    // 判断之前向量是否共线
                    if(dx1 * dy2 == dx2 * dy1) {
                        // 共线则计数
                        max++;
                        res = Math.max(res, max);
                    }
                }
            }
        }
        return res;
    }
相关推荐
大鱼>6 分钟前
因子挖掘+回测+RL交易:量化金融完整系统
人工智能·深度学习·算法·金融
一水24 分钟前
TTFT优化:一个方案的5次推倒重来
java·ai·状态模式
AC赳赳老秦30 分钟前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
磁爆步兵1 小时前
内存分区:程序运行的核心秘密
java·开发语言·jvm
流星白龙2 小时前
【Docker】4.NameSpace空间隔离实战
java·运维·docker
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第207题】【09_Zookeeper篇】第8题:谈谈 ZooKeeper 的可靠性保障机制
java·zookeeper·高可用·可靠性·分布式系统
c238562 小时前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
harmful_sheep2 小时前
maven多版本包导致java.lang.NoClassDefFoundError
java·maven
noipp2 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
极客BIM工作室2 小时前
OpenCascade 倒角(Chamfer)算法完整逻辑解析
算法