题解 | #直线上的牛#
直线上的牛
https://www.nowcoder.com/practice/58ff4047d6194d2ca4d80869f53fa6ec
知识点
斜率
解题思路
遍历所有牛的位置,对于每个位置,计算该位置与其他位置之间的斜率,并将斜率与相应的计数存储在哈希表中。在计算斜率时,我们将斜率表示为 dx/dy 的字符串形式,并使用最大公约数来简化表示。如果两个位置的坐标差为0,表示它们是相同的位置,我们更新相同位置的牛的数量。然后,我们计算同时通过某个点的直线上最多有多少头牛,包括相同位置的牛。最后,我们更新最大值。
Java题解
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param points int整型二维数组 * @return int整型 */ public int maxPoints(int[][] points) { int n = points.length; if (n <= 2) { return n; } int maxCount = 0; for (int i = 0; i < n; i++) { Map<String, Integer> slopeCountMap = new HashMap<>(); // 斜率与计数的映射表 int samePointCount = 0; for (int j = i + 1; j < n; j++) { int x1 = points[i][0]; int y1 = points[i][1]; int x2 = points[j][0]; int y2 = points[j][1]; // 计算两点之间的斜率 int dx = x1 - x2; int dy = y1 - y2; if (dx == 0 && dy == 0) { samePointCount++; continue; } int gcd = gcd(dx, dy); dx /= gcd; dy /= gcd; String slope = dx + "/" + dy; slopeCountMap.put(slope, slopeCountMap.getOrDefault(slope, 0) + 1); } int count = samePointCount + 1; for (int value : slopeCountMap.values()) { count = Math.max(count, value + samePointCount + 1); } maxCount = Math.max(maxCount, count); } return maxCount; } // 求最大公约数 private int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } }