• 149. Max Points on a Line


    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

    本题是比较难的题目,首先需要弄懂一点,就是最大公约数是最大的可整除数,也就是默认为k值(y=kx+b),然后用两个hashmap来存储(x,map),(y,number)值,再这里面要排除掉overlap的值,因此还需要用一个overlap的变量来记录相同的值。当然,本身的点也没有算进去,因此,总的result=max+1+overlap。代码如下:

     1 /**
     2  * Definition for a point.
     3  * class Point {
     4  *     int x;
     5  *     int y;
     6  *     Point() { x = 0; y = 0; }
     7  *     Point(int a, int b) { x = a; y = b; }
     8  * }
     9  */
    10 public class Solution {
    11     public int maxPoints(Point[] points) {
    12         Map<Integer,Map<Integer,Integer>> map = new HashMap<>();
    13         if(points==null) return 0;
    14         int result = 0;
    15         if(points.length<=2) return points.length;
    16         for(int i=0;i<points.length;i++){
    17             map.clear();
    18             int max  =0;
    19             int overlap = 0;
    20             for(int j=i+1;j<points.length;j++){
    21                 int x = points[j].x-points[i].x;
    22                 int y = points[j].y-points[i].y;
    23                 if(x==0&&y==0){
    24                     overlap++;
    25                     continue;
    26                 } 
    27                 int gcd = GCD(x,y);
    28                 if(gcd!=0){
    29                     x = x/gcd;
    30                     y = y/gcd;   
    31                 }
    32                 if(map.containsKey(x)){
    33                     if(map.get(x).containsKey(y)){
    34                         map.get(x).put(y,map.get(x).get(y)+1);
    35                     }else{
    36                         map.get(x).put(y,1);
    37                     }
    38                 }else{
    39                     Map<Integer,Integer> m = new HashMap<Integer,Integer>();
    40                     m.put(y,1);
    41                     map.put(x,m);
    42                 }
    43                 max = Math.max(max,map.get(x).get(y));
    44             }
    45             result = Math.max(result,max+1+overlap);
    46         }
    47         return result;
    48     }
    49     public int GCD(int a,int b){
    50         if(b==0) return a;
    51         return GCD(b,a%b);
    52     }
    53 }

    做这道题目要注意gcd不能为0;还有x=0,y=0的时候就要跳出循环;

  • 相关阅读:
    主席树学习记录
    P1072 Hanson 的趣味题 题解
    好文章收集
    计算几何专题
    小问题
    CSP-S2020题解
    上下界网络流
    想到的无法解决的点子
    省选联考2020组合数问题
    省选数学复习
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6551660.html
Copyright © 2020-2023  润新知