当前位置: 首页 > news >正文

LeetCode 149:直线上最多的点数

LeetCode 149:直线上最多的点数

在这里插入图片描述

问题本质与核心挑战

给定平面上的点集,需找到 同一直线上最多的点数。核心挑战:

  • 如何高效判断三点共线(避免浮点数精度问题);
  • 如何统计不同直线上的点数,避免重复计算。

核心思路:斜率归一化 + 哈希表统计

1. 斜率的归一化表示

两点 (x1,y1)(x2,y2) 的斜率可通过 Δx 和 Δy 的最简分数形式 表示,避免浮点数误差:

  • 计算 Δx = x2 - x1Δy = y2 - y1
  • ΔxΔy最大公约数(GCD),将两者除以 GCD 得到最简形式;
  • 统一符号:确保相同斜率的表示唯一(如 Δx=-2, Δy=4Δx=2, Δy=-4 应归一为同一键)。
2. 哈希表统计
  • 枚举每个点作为基准点,统计其他点与该基准点的斜率;
  • 用哈希表记录同一斜率的点的数量,结合基准点自身,得到当前直线的最大点数;
  • 遍历所有基准点,更新全局最大值。

算法步骤详解(以示例 points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]] 为例)

步骤 1:特殊情况处理

若点集大小 n ≤ 2,直接返回 n(所有点共线)。

步骤 2:枚举基准点,计算斜率

以点 (3,2)(索引 1)为基准点,计算其他点的斜率:

其他点 (x,y)Δx = x-3Δy = y-2GCD(Δx,Δy)最简形式(Δx/GCD, Δy/GCD)归一化键(统一符号后)
(1,1)-2-11(-2,-1)2,1(Δx<0,取反)
(5,3)211(2,1)2,1
(4,1)1-11(1,-1)1,-1
(2,3)-111(-1,1)1,-1(Δx<0,取反)
(1,4)-222(-1,1)1,-1(Δx<0,取反)
步骤 3:哈希表统计与最大值更新
  • 哈希表记录斜率 2,1 出现 2 次,1,-1 出现 3 次;
  • 当前基准点的最大点数为 3 + 1 = 43 个其他点 + 基准点自身),与示例输出一致。

完整代码(Java)

class Solution {public int maxPoints(int[][] points) {int n = points.length;if (n <= 2) return n; // 特殊情况:≤2个点必共线int maxCount = 0;for (int i = 0; i < n; i++) { // 枚举每个基准点Map<String, Integer> slopeMap = new HashMap<>();int currentMax = 0;for (int j = 0; j < n; j++) { // 遍历其他点if (i == j) continue; // 跳过自身int x1 = points[i][0], y1 = points[i][1];int x2 = points[j][0], y2 = points[j][1];int dx = x2 - x1;int dy = y2 - y1;String key = getNormalizedSlope(dx, dy); // 归一化斜率slopeMap.put(key, slopeMap.getOrDefault(key, 0) + 1);currentMax = Math.max(currentMax, slopeMap.get(key));}maxCount = Math.max(maxCount, currentMax + 1); // +1 包含基准点自身}return maxCount;}// 归一化斜率:返回统一表示的键private String getNormalizedSlope(int dx, int dy) {if (dx == 0 && dy == 0) {return "0,0"; // 理论上不会出现(点不重复)}int gcd = computeGCD(dx, dy);dx /= gcd;dy /= gcd;// 统一符号:保证dx非负;若dx为0,保证dy非负if (dx == 0) {dy = Math.abs(dy);} else {if (dx < 0) {dx = -dx;dy = -dy;}}return dx + "," + dy;}// 计算最大公约数(处理负数)private int computeGCD(int a, int b) {a = Math.abs(a);b = Math.abs(b);while (b != 0) {int temp = b;b = a % b;a = temp;}return a;}
}

关键逻辑解析

  1. 斜率归一化

    • 通过 GCD 约分 Δx 和 Δy,避免重复斜率因倍数关系被误判;
    • 统一符号(如 (-2,-1) 转为 (2,1)),确保相同斜率的键唯一。
  2. 哈希表统计

    • 每个基准点独立统计,避免不同基准点的斜率干扰;
    • currentMax + 1 包含基准点自身,保证计数正确。
  3. 时间复杂度

    • 外层遍历 O(n) 个基准点,内层遍历 O(n) 个点,哈希表操作 O(1),总复杂度 O(n²),可处理 n=300 的规模。

该方法通过 数学归一化解决精度问题,结合 哈希表高效统计,完美平衡了正确性和效率,是处理“共线点计数”问题的经典方案。

http://www.dtcms.com/a/316269.html

相关文章:

  • 深入理解 C 语言中的拷贝函数
  • 多模态新方向|从数据融合到场景落地,解锁视觉感知新范式
  • 智能驾驶再提速!批量苏州金龙L4级自动驾驶巴士交付杭州临平区
  • 结合opencv解释图像处理中的结构元素(Structuring Element)
  • 使用PyQT创建一个简单的图形界面
  • 【面试场景题】日志去重与统计系统设计
  • 人工智能领域、图欧科技、IMYAI智能助手2025年5月更新月报
  • UGUI源码剖析(1):基础架构——UIBehaviour与Graphic的核心职责与生命周期
  • Git 中**未暂存**和**未跟踪**的区别:
  • 【深度学习-Day 41】解密循环神经网络(RNN):深入理解隐藏状态、参数共享与前向传播
  • P2161 [SHOI2009] 会场预约
  • 中山铸造加工件自动蓝光三维测量方案-中科米堆CASAIM
  • 喷砂机常见故障及排除维修解决方法有哪些?
  • 猎板深度解析:EMI 干扰 —— 电子设备的隐形 “破坏者”
  • Dot1x认证原理详解
  • 利用 Radius Resource Types 扩展平台工程能力
  • 在 QtC++ 中调用 OpenCV 实现特征检测与匹配及图像配准应用
  • Linux DNS缓存与Nginx DNS缓存运维文档
  • 数据结构 | 树的秘密
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pytorch-lightning’问题
  • 机器学习之线性回归与逻辑回归
  • 网络muduo库的实现(2)
  • 计算机算术5-整形除法
  • MySql数据库归档工具pt-archiver
  • Android audio之 AudioDeviceInventory
  • 第三方验收测试报告:软件项目验收中的核心要素
  • 前端权限设计
  • Pandas query() 方法详解
  • 涨薪技术|Kubernetes(k8s)之Pod生命周期(上)
  • Deveco Studio 3.1.0.501 Windows版下载安装教程 - 华为开发者工具安装步骤详解