这个问题要求在给定的点集中找到同一条直线上的最多点数。下面是一个完整的解决方案:

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);
}

这个解决方案的核心思路:

  1. 双重循环:外层循环选择基准点,内层循环计算该点与其他点的斜率
  2. 斜率计算:使用最简分数形式存储斜率,避免浮点数精度问题
  3. 重合点处理:单独统计与基准点重合的点
  4. 哈希表记录:用字符串格式的斜率作为键,统计相同斜率的点数

算法的时间复杂度是O(n²),空间复杂度是O(n),其中n是点的数量。这种方法能正确处理所有边界情况,包括垂直线、水平线和重合点。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐