leetcode 207.課程表
阿新 • • 發佈:2021-06-20
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); }
具體實現:
classSolution { 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); } }