zoukankan      html  css  js  c++  java
  • leetcode149

     1   /*
     2      *  A line is determined by two factors,say y=ax+b
     3      *  
     4      *  If two points(x1,y1) (x2,y2) are on the same line(Of course). 
     5 
     6      *  Consider the gap between two points.
     7 
     8      *  We have (y2-y1)=a(x2-x1),a=(y2-y1)/(x2-x1) a is a rational, b is canceled since b is a constant
     9 
    10      *  If a third point (x3,y3) are on the same line. So we must have y3=ax3+b
    11 
    12      *  Thus,(y3-y1)/(x3-x1)=(y2-y1)/(x2-x1)=a
    13 
    14      *  Since a is a rational, there exists y0 and x0, y0/x0=(y3-y1)/(x3-x1)=(y2-y1)/(x2-x1)=a
    15 
    16      *  So we can use y0&x0 to track a line;
    17      */
    18     
    19     public class Solution{
    20         public int maxPoints(Point[] points) {
    21             if (points==null) return 0;
    22             if (points.length<=2) return points.length;
    23             
    24             Map<Integer,Map<Integer,Integer>> map = new HashMap<Integer,Map<Integer,Integer>>();
    25             int result=0;
    26             for (int i=0;i<points.length;i++){ 
    27                 map.clear();
    28                 int overlap=0,max=0;
    29                 for (int j=i+1;j<points.length;j++){
    30                     int x=points[j].x-points[i].x;
    31                     int y=points[j].y-points[i].y;
    32                     if (x==0&&y==0){
    33                         overlap++;
    34                         continue;
    35                     }
    36                     int gcd=generateGCD(x,y);
    37                     if (gcd!=0){
    38                         x/=gcd;
    39                         y/=gcd;
    40                     }
    41                     
    42                     if (map.containsKey(x)){
    43                         if (map.get(x).containsKey(y)){
    44                             map.get(x).put(y, map.get(x).get(y)+1);
    45                         }else{
    46                             map.get(x).put(y, 1);
    47                         }                       
    48                     }else{
    49                         Map<Integer,Integer> m = new HashMap<Integer,Integer>();
    50                         m.put(y, 1);
    51                         map.put(x, m);
    52                     }
    53                     max=Math.max(max, map.get(x).get(y));
    54                 }
    55                 result=Math.max(result, max+overlap+1);
    56             }
    57             return result;
    58             
    59             
    60         }
    61         private int generateGCD(int a,int b){
    62     
    63             if (b==0) return a;
    64             else return generateGCD(b,a%b);
    65             
    66         }
    67     }

    参考:https://leetcode.com/problems/max-points-on-a-line/discuss/47113/A-java-solution-with-notes

  • 相关阅读:
    LeetCode 485. Max Consecutive Ones
    LeetCode 367. Valid Perfect Square
    LeetCode 375. Guess Number Higher or Lower II
    LeetCode 374. Guess Number Higher or Lower
    LeetCode Word Pattern II
    LeetCode Arranging Coins
    LeetCode 422. Valid Word Square
    Session 共享
    java NIO
    非阻塞IO
  • 原文地址:https://www.cnblogs.com/asenyang/p/10496370.html
Copyright © 2011-2022 走看看