image.png

解决思路

Map

一句话解释: 固定一点, 找其他点和这个点组成直线, 统计他们的斜率!

这里有一个重点: 求斜率.用两种方法

  1. 用最大约数方法(gcd), 把他化成最简形式, 3/6 == 2/4 == 1/2
  2. 除数(不太精确, 速度快!)
  1. public int gcd(int dy,int dx){
  2. if(dx == 0)
  3. return dy;
  4. else
  5. return gcd(dx,dy%dx);
  6. }
  7. public int maxPoints(int[][] points){
  8. int n = points.length;
  9. if(n==0) return 0;
  10. if(n==1) return 1;
  11. int res = 0;
  12. for(int i = 0;i<n-1;i++){
  13. Map<String,Integer> slope = new HashMap<>();
  14. int repeat = 0;
  15. int tmp_max = 0;
  16. for(int j = i+1;j<n;j++){
  17. int dy = points[i][1] - points[j][1];
  18. int dx = points[i][0] - points[j][0];
  19. if(dy == 0 && dx == 0)
  20. {
  21. repeat++;
  22. continue;
  23. }
  24. int g = gcd(dy,dx);
  25. if(g!=0){
  26. dy /= g;
  27. dx /= g;
  28. }
  29. String tmp = String.valueOf(dy) + "/" + String.valueOf(dx);
  30. slope.put(tmp,slope.getOrDefault(tmp,0)+1);
  31. tmp_max = Math.max(tmp_max,slope.get(tmp));
  32. }
  33. res = Math.max(res,repeat+tmp_max+1);
  34. }
  35. return res;
  36. }