https://leetcode-cn.com/problems/max-points-on-a-line/submissions/
- 搞一张map, key放的是斜率,value放的是共享这个斜率的点有多少个
- key用什么类型? double吗? 不行,有精度损耗,分子分母约一个最大公约数,然后用字符串 “分子_分母” 的形式表示
- 为什么要约成最简形式?
- 因为6/10和3/5虽然是一样的,但是表示成字符串就不一样了6_10, 3_5
- 为什么要约成最简形式?
- 或者用两张map

- 第一Integer是所有的分子, 第二个map中的第一个Integer是分母, 第二个Integer是点数
- 有单独两类需要单独处理
- 和我共y的
- 和我共x的

- 所以最后map里的最优者需要和这两个去pk
注意,如果数组中有重复点的话,最后pk出来的这个最优者还要加上重复点的个数
public int maxPoints(int[][] points) {if (points == null) {return 0;}if (points.length <= 2) {return points.length;}Map<Integer, Map<Integer, Integer>> map = new HashMap<>();int result = 0;for (int i = 0; i < points.length; i++) {map.clear();int samePosition = 1;int sameX = 0;int sameY = 0;int line = 0;for (int j = i + 1; j < points.length; j++) {int x = points[j][0] - points[i][0];int y = points[j][1] - points[i][1];if (x == 0 && y == 0) {samePosition++;} else if (x == 0) {sameX++;} else if (y == 0) {sameY++;} else {int gcd = gcd(x, y);x /= gcd;y /= gcd;if (!map.containsKey(x)) {map.put(x, new HashMap<>());}if (!map.get(x).containsKey(y)) {map.get(x).put(y, 0);}map.get(x).put(y, map.get(x).get(y) + 1);line = Math.max(line, map.get(x).get(y));}}result = Math.max(result, Math.max(Math.max(sameX, sameY), line) + samePosition);}return result;}public int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);}
