1. 程式人生 > >[Leetcode]Max Points on a Line

[Leetcode]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.

這道題中最重要的是處理相同點。我們最基本的想法是利用一個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;
	    }