1. 程式人生 > 其它 >Linux基礎06——壓縮、解壓、安裝命令

Linux基礎06——壓縮、解壓、安裝命令

149. 直線上最多的點數

給你一個數組points,其中points[i] = [xi, yi]表示X-Y平面上的一個點。求最多有多少個點在同一條直線上。

示例 1:

輸入:points = [[1,1],[2,2],[3,3]]
輸出:3

示例 2:

輸入:points = [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
輸出:4

提示:

  • 1 <= points.length <= 300
  • points[i].length == 2
  • -104<= xi, yi<= 104
  • points中的所有點互不相同

思路1:

  固定一個點,遍歷其他點,求與這個固定的點

斜率相同的點(也就是一條直線),統計點數,求最大數量
  注意:由於求斜率時,可能會出現分子,分母約分的情況,因此求其分子與分母的最大公約數,並簡化分子與分母,並組合成key,儲存斜率。


ref:https://leetcode-cn.com/problems/max-points-on-a-line/solution/149-zhi-xian-shang-zui-duo-de-dian-shu-b-wcum/

最大公約數的實現:

int gcd(int x, int y) {
    if (y == 0) return x;
    return gcd(y, x%y);
}

具體實現:

class
Solution { public int maxPoints(int[][] points) { int row = points.length; if (row <= 2) return row; int res = 0; for (int i=0; i<row; i++) { Map<String, Integer> cnt = new HashMap<>(); int max = 0; int duplicate = 0;
for (int j=i+1; j<row; j++) { int x = points[i][0] - points[j][0]; int y = points[i][1] - points[j][1]; if (x == 0 && y == 0) { duplicate++; continue; } int gcd = gcd(x, y); int gx = x / gcd; int gy = y / gcd; String key = gx + "@" + gy; cnt.put(key, cnt.getOrDefault(key, 0) + 1); max = Math.max(cnt.get(key), max); } res = Math.max(res, max + duplicate + 1); } return res; } private int gcd(int x, int y) { if (y == 0) return x; return gcd(y, x%y); } }