149. 直线上最多的点数
暴力做法就是三次遍历:
class Solution {public int maxPoints(int[][] ps) {int n = ps.length;int ans = 1;for (int i = 0; i < n; i++) {int[] x = ps[i];for (int j = i + 1; j < n; j++) {int[] y = ps[j];int cnt = 2;for (int k = j + 1; k < n; k++) {int[] p = ps[k];int s1 = (y[1] - x[1]) * (p[0] - y[0]);int s2 = (p[1] - y[1]) * (y[0] - x[0]);if (s1 == s2) cnt++;}ans = Math.max(ans, cnt);}}return ans;}}
注意,不用除法,直接用乘法,判断斜率是否一样即可。
优化使用hashmap
class Solution {public int maxPoints(int[][] ps) {int n = ps.length;int ans = 1;for (int i = 0; i < n; i++) {Map<String, Integer> map = new HashMap<>();// 由当前点 i 发出的直线所经过的最多点数量int max = 0;for (int j = i + 1; j < n; j++) {int x1 = ps[i][0], y1 = ps[i][1], x2 = ps[j][0], y2 = ps[j][1];int a = x1 - x2, b = y1 - y2;int k = gcd(a, b);String key = (a / k) + "_" + (b / k);map.put(key, map.getOrDefault(key, 0) + 1);max = Math.max(max, map.get(key));}ans = Math.max(ans, max + 1);}return ans;}int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);}}
