[Leetcode]Max Points on a Line
阿新 • • 發佈:2019-02-14
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
這道題中最重要的是處理相同點。我們最基本的想法是利用一個map,用斜率k作為map的key,然後計算每個點與當前遍歷點的斜率k,增加相應map中的value。但這個想法需要注意處理相同點,因為相同的點,其斜率不能用斜率公式來計算。在遍歷點的過程中,需要兩重迴圈,遍歷過的點在後邊的點遍歷時不用再考慮,因為穿過該點的直線已經被考慮過了。
public int maxPoints(Point[] points) { if (points==null||points.length==0){ return 0; } HashMap<Double, Integer> map=new HashMap<Double, Integer>(); int max=1; for(int i=0; i<points.length; i++){ // shared point changed, map should be cleared and serve the new point map.clear(); // maybe all points contained in the list are same points,and same points' k is // represented by Integer.MIN_VALUE map.put((double)Integer.MIN_VALUE, 1); int dup=0; for(int j=i+1; j<points.length; j++){ if (points[j].x==points[i].x&&points[j].y==points[i].y){ dup++; continue; } // look 0.0+(double)(points[j].y-points[i].y)/(double)(points[j].x-points[i].x) // because (double)0/-1 is -0.0, so we should use 0.0+-0.0=0.0 to solve 0.0 !=-0.0 // problem // if the line through two points are parallel to y coordinator, then K(slop) is // Integer.MAX_VALUE double key=points[j].x-points[i].x==0?Integer.MAX_VALUE:0.0+(double)(points[j].y-points[i].y)/(double)(points[j].x-points[i].x); if (map.containsKey(key)){ map.put(key, map.get(key)+1); } else{ map.put(key, 2); } } for (int temp: map.values()){ // duplicate may exist if (temp+dup>max){ max=temp+dup; } } } return max; }