腾讯元宝DeepSeek LeetCode 149.直线上最多的点数 public int maxPoints(int[][] points)
·
这个问题要求在给定的点集中找到同一条直线上的最多点数。下面是一个完整的解决方案:
public int maxPoints(int[][] points) {
int n = points.length;
if (n <= 2) return n;
int maxCount = 1;
for (int i = 0; i < n; i++) {
// 记录从points[i]出发的各个斜率对应的点数
Map<String, Integer> slopeMap = new HashMap<>();
int duplicate = 0; // 与points[i]重合的点
int currentMax = 0;
for (int j = i + 1; j < n; j++) {
int dx = points[j][0] - points[i][0];
int dy = points[j][1] - points[i][1];
// 处理重合点
if (dx == 0 && dy == 0) {
duplicate++;
continue;
}
// 计算最简分数形式的斜率,避免浮点数精度问题
int gcd = gcd(dx, dy);
dx /= gcd;
dy /= gcd;
// 生成斜率的字符串表示
String slope = dx + "/" + dy;
slopeMap.put(slope, slopeMap.getOrDefault(slope, 0) + 1);
currentMax = Math.max(currentMax, slopeMap.get(slope));
}
// 更新最大值:当前点的结果+重合点+自身
maxCount = Math.max(maxCount, currentMax + duplicate + 1);
}
return maxCount;
}
// 计算最大公约数(使用绝对值处理负数情况)
private int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
这个解决方案的核心思路:
- 双重循环:外层循环选择基准点,内层循环计算该点与其他点的斜率
- 斜率计算:使用最简分数形式存储斜率,避免浮点数精度问题
- 重合点处理:单独统计与基准点重合的点
- 哈希表记录:用字符串格式的斜率作为键,统计相同斜率的点数
算法的时间复杂度是O(n²),空间复杂度是O(n),其中n是点的数量。这种方法能正确处理所有边界情况,包括垂直线、水平线和重合点。
更多推荐




所有评论(0)