Max Points on a Line

LeetCode Max Points on a Line 

文章转载自

      http://blog.csdn.net/worldwindjp/article/details/18882849

给你一组点,求共线最多点的个数。

思路,暴力枚举,以每个“点”为中心,然后遍历剩余点,求出以i为起点j为终点的斜率(j>i),斜率相同的点一定共线。

对每个i,初始化一个哈希表,key 为斜率,value 为该直线上的点数。遍历结束后得到和当前i点共线的点的最大值,再和全局最大值比较,最后就是结果。

时间复杂度O(n2),空间复杂度O(n)。

其中有几点要注意的是: 存在坐标一样的点;存在斜率不存在的点(与x轴平行的直线)。

上AC代码:

[java] view plain copy
  1. public static int maxPoints(Point[] points) {  
  2.       
  3.     if(points.length<=2) {  
  4.         return points.length;  
  5.     }  
  6.     //斜率  
  7.     double k = 0.0;  
  8.     int maxPointNum      = 0;  
  9.     int tempMaxPointNum  = 0;  
  10.     //坐标完全相同点的个数  
  11.     int samePointNum     = 0;  
  12.     //与x轴平行  
  13.     int parallelPointNum = 0;   
  14.     HashMap<Double,Integer> slopeMap = new HashMap<Double,Integer>();  
  15.     for(int i=0;i<points.length-1;i++) {  
  16.         //代表起始点,会被累加上  
  17.         samePointNum     = 1;  
  18.         parallelPointNum = 0;   
  19.         tempMaxPointNum  = 0;  
  20.         slopeMap.clear();  
  21.         for(int j=i+1;j<points.length;j++) {  
  22.             //坐标完全相同  
  23.             if((points[i].x == points[j].x)&&((points[i].y == points[j].y))) {  
  24.                 samePointNum++;  
  25.                 continue;  
  26.             }  
  27.             //与y轴平行  
  28.             if(points[i].x == points[j].x) {  
  29.                 parallelPointNum++;  
  30.             } else {  
  31.                 if(points[i].y == points[j].y) {  
  32.                     k = 0;  
  33.                 } else {  
  34.                     k = ((double)(points[i].y - points[j].y))/(points[i].x - points[j].x);  
  35.                 }  
  36.                 //斜率不存在  
  37.                 if(slopeMap.get(k)==null) {  
  38.                     slopeMap.put(k, new Integer(1));  
  39.                     if(1>tempMaxPointNum) {  
  40.                         tempMaxPointNum = 1;  
  41.                     }  
  42.                 }else {  
  43.                     //斜率已存在  
  44.                     int number = slopeMap.get(k);  
  45.                     number++;  
  46.                     slopeMap.put(k, new Integer(number));  
  47.                     if(number>tempMaxPointNum) {  
  48.                         tempMaxPointNum = number;  
  49.                     }  
  50.                 }  
  51.             }  
  52.         } //end of for  
  53.           
  54.         if(parallelPointNum>1) {  
  55.             if(parallelPointNum>tempMaxPointNum) {  
  56.                 tempMaxPointNum = parallelPointNum;  
  57.             }  
  58.         }  
  59.         //加上起始点和具有相同坐标的点  
  60.         tempMaxPointNum += samePointNum;  
  61.         if(tempMaxPointNum>maxPointNum) {  
  62.             maxPointNum = tempMaxPointNum;  
  63.         }  
  64.     }  
  65.     return maxPointNum;  

你可能感兴趣的:(Max Points on a Line)