LeetCode003

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

给定2D平面上的n个点,找到位于同一直线上的最大点数

  • 运用穷举的方法
  • 两点组成一条直线
  • 若无特殊情况,当点a与b组成直线的斜率,和点b与c组成直线的斜率相同时,则认为这三个点a、b、c是在同一直线上的
  • 特殊情况是:当点b与a重复
  • 若平面中没有点:   points.length==0 return 0;
  • 若平面中只有一个或者两个点:   points.length<=2 return points.length;
  • 若平面中至少有三个点:   进行遍历循环
  1. for 将每个点都当做第一个点a进行遍历:

               2.for : ~若第二个点b与第一个点a是否重复-- 得到重复的点rep的数量

                         ~点b若不重复带点a--得到不重复的点的数量kp:

                                          3.for:对第三个点c进行遍历,判断cb之间的斜率是否与ab的斜率相同;

                                                  ~若相同,则kp++;

                        ~最大点数=rep+kp;在得到最大点数之后,kp都要归1,以进行下一个数的遍历;

 

public class MaxPoints {
	//给定2D平面上的n个点,找到位于同一直线上的最大点数
	 public int maxPoints(Point[] points) {
		 if(points.length == 0) {
			 return 0;
		 }
		 if(points.length <= 2 && points.length > 0) {
			 return points.length;
		 }
		 int max = 2;
		 for(int i = 0 ; i < points.length ; i++ ) {
			 int rep = 0;//重复的点的个数
			 int kp = 1;//在这条直线下有几个非重复点
			 
			 for(int j = i + 1 ; j < points.length ; j++ ) {
				 double x1 = points[j].x - points[i].x;
				 double y1 = points[j].y - points[i].y;
				 
				 if(x1 == 0 && y1 == 0) {
					 rep++;
				 }else {
					 kp++;
					 for(int k = j + 1 ; k < points.length ; k++ ) {
						 double x2 = points[k].x - points[j].x;
						 double y2 = points[k].y - points[j].y;
						 if(x1 * y2 == x2 * y1) {
							 kp++;
						 }
					 }
				 
				 }
				 if(max < (rep + kp)) {
					 max = rep + kp;//最大点的个数为同一条直线上的点加上重复点
				 }
				 kp = 1;//每次开始循环遍历第二个点时,都需要将kp重置为1;
			 }
		 }
		 return max;
	    }
	
}
//class Point {
//	     int x;
//	     int y;
//	     Point() { x = 0; y = 0; }
//	     Point(int a, int b) { x = a; y = b; }
//	  }

代码参考自:

https://www.jianshu.com/p/0abcec2fcfba

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值