1. 问题解析与解题思路
1.1 题目重述与理解
LeetCode 149题要求我们找出二维平面上最多有多少个点位于同一条直线上。给定一个由点组成的数组points,其中points[i] = [xi, yi],我们需要返回位于同一直线上的最大点数。
这个问题看似简单,但实际需要考虑多种边界情况:
- 空数组或单点情况
- 所有点都相同的情况
- 垂直直线(斜率无穷大)的情况
- 浮点数精度问题
1.2 核心难点分析
解决这个问题的关键在于如何高效准确地判断多个点是否共线。直接思路是三重循环检查所有可能的直线,但时间复杂度会达到O(n³),这在LeetCode上显然无法通过。
更聪明的做法是利用斜率和截距来判断共线性。对于每个点,我们计算它与其他所有点形成的直线斜率,统计相同斜率的出现次数。但这里有几个技术难点需要解决:
- 斜率表示问题:直接用(y2-y1)/(x2-x1)计算斜率会遇到浮点数精度问题
- 垂直直线处理:当x坐标相同时,斜率无穷大
- 重复点处理:多个点坐标完全相同的情况
- 最大公约数计算:为了准确比较斜率,需要用分数的最简形式表示
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与实现细节
2.1 斜率计算优化方案
为了避免浮点数精度问题,我们不用实际计算斜率值,而是用分数的最简形式来表示斜率。具体来说:
- 计算Δx和Δy(x坐标差和y坐标差)
- 计算Δx和Δy的最大公约数(GCD)
- 将Δx和Δy分别除以GCD,得到最简分数形式
- 用字符串"Δy/Δx"作为斜率的唯一标识
对于垂直直线(Δx=0),我们可以用特殊字符串"vertical"表示。
2.2 最大共线点统计方法
对于每个点points[i],执行以下步骤:
- 初始化一个哈希表,用于统计不同斜率的出现次数
- 遍历所有其他点points[j](j≠i):
- 如果points[i]和points[j]相同,增加重复点计数
- 否则计算两点形成的直线斜率(用上述分数表示法)
- 在哈希表中对应斜率的计数加1
- 找出哈希表中最大的计数值,加上重复点数和1(当前点本身)
- 更新全局最大共线点数
2.3 边界情况处理
需要特别注意以下几种边界情况:
- 空输入:直接返回0
- 单
