关闭

161. Max Points on a Line

110人阅读 评论(0) 收藏 举报
分类:

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

Subscribe to see which companies asked this question。

分别求每个点与其共线的最多点的个数。 要进行两层循环,最外层固定一个点Point[i];然后计算Point[i]与其他点的直线斜率,统计出斜率相同的点的个数,找出最大值,即为与Point[i]共线最多的点的个数。最后计算所有Point[i]中的最大值即为最后的结果。
 注意的地方:
 1.当内层循环与外层循环是同一个点的时候就忽略内层循环对该点的处理;
 2.内层遇到的点与外层选定的点是同一个时;
 3.内层循环遇到的点与外层选定的点在同一竖直线上时.

最后要计算points[i]在同一直线上最大值时这个地方要注意,Max是要与 entry.getValue()+same-1相比较,例子[[1,1],[1,1],[1,1],[4,5],[4,5]]

  /**
	 * 分别求每个点与其共线的最多点的个数。
	 * 要进行两层循环,最外层固定一个点Point[i];
	 * 然后计算Point[i]与其他点的直线斜率,统计出斜率相同的点的个数,找出最大值,即为与Point[i]共线最多的点的个数。
	 * 最后计算所有Point[i]中的最大值即为最后的结果。
	 * 
	 * 注意的地方:
	 * 1.当内层循环与外层循环是同一个点的时候就忽略内层循环对该点的处理;
	 * 2.内层遇到的点与外层选定的点是同一个时;
	 * 3.内层循环遇到的点与外层选定的点在同一竖直线上时.
	 */
	 public int maxPoints(Point[] points) {
		 
		 int len = points.length;
		 /*如果len小于等于2则返回这个len*/
		 if(len <=2){
			 return len;
		 }
		 /*Max定义好准备返回最后的结果*/
		 int Max = 0;
		 /*与points[i]相同的点的个数*/
		 int same = 1;
		 /*HashMap中存的是每个斜率对应的相同点的个数*/
		 HashMap<Double, Integer> countMap = new HashMap<Double, Integer>();
		 
		 for(int i=0;i<len;i++){
			 /*Step1:选定points[i]之后计算该点与其他点的斜率*/
			 countMap.clear();
			 same = 1;
			 for(int j=0;j<len;j++){
				 /*如果是同一个points[i]则忽略*/
				 if(i==j){
					 continue;
				 }
				 /*如果points[j]与points[i]相同,没有办法计算这两个节点的xiel,则same++*/
				 if(points[i].x == points[j].x && points[i].y == points[j].y){
					 same++;
				 }else{
					 /*计算斜率是要注意斜率不存在的情况*/
					 double slope = points[i].x == points[j].x ? Integer.MAX_VALUE:(points[i].y - points[j].y+0.0)/(points[i].x - points[j].x); 
					 int num = 1;
					 if(countMap.containsKey(slope)){
						 num = countMap.get(slope);
					 }
					 num ++;
					 countMap.put(slope, num);
				 }
			 }
			 /*Step2:计算与points[i]在同一条线上的最多点的点的个数*/
			 Max = Max < same ? same : Max;
			 for(Map.Entry<Double, Integer> entry : countMap.entrySet()){
				 if(Max < entry.getValue()+same-1){//这个地方要注意,Max是要与 entry.getValue()+same-1相比较,例子[[1,1],[1,1],[1,1],[4,5],[4,5]]
					 Max = entry.getValue()+same-1;
				 }
			 }
		 }
		 
		 return Max;
	        
	    }


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:61637次
    • 积分:2888
    • 等级:
    • 排名:第12320名
    • 原创:232篇
    • 转载:35篇
    • 译文:0篇
    • 评论:3条
    最新评论