1. 问题背景与核心挑战
给定一个二维平面上的点集,如何找出位于同一条直线上点的最大数量?这是LeetCode第149题"直线上最多的点数"要解决的核心问题。乍看简单,实则暗藏玄机。
我在第一次遇到这个问题时,以为只需要计算两两点之间的斜率就能轻松解决。但实际编码时发现,浮点数精度问题、垂直线特殊情况、重复点处理等细节会让代码迅速变得复杂。经过多次调试和优化,最终总结出一套可靠的C语言解法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法思路分析
2.1 暴力枚举法
最直观的解法是三重循环:对于每个点,计算它与其他所有点组成的直线,然后统计每条直线上的点数。这种方法时间复杂度高达O(n³),在LeetCode上会直接超时。
c复制// 伪代码示例(实际不可行)
int maxPoints = 0;
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
int count = 2;
for (int k = j+1; k < n; k++) {
if (isCollinear(points[i], points[j], points[k])) {
count++;
}
}
maxPoints = max(maxPoints, count);
}
}
2.2 斜率统计优化
更聪明的做法是:对于每个点,计算它与其他所有点的斜率,用哈希表统计相同斜率的频次。这样可以将时间复杂度降到O(n²)。
关键观察点:
- 同一个点会被多次计算,需要特殊处理
- 垂直线(斜率无穷大)需要单独处理
- 浮点数精度问题可能导致相同的斜率被误判为不同
3. C语言实现详解
3.1 数据结构定义
c复制typedef struct {
int x;
int y;
} Point;
// 简化分数表示(避免浮点精度问题)
typedef struct {
int dx;
int dy;
} Fraction;
3.2 斜率计算函数
c复制Fraction g
