在二维平面上给定n点,找出在同一直线上的最大点数。

题目:

在二维平面上给定n点,找出在同一直线上的最大点数。
给出点的定义:
public class Point {
	int x;
	int y;
	Point() { x = 0; y = 0; }
	Point(int a, int b) { x = a; y = b; }
}
思路:

对于第i个点,
从第1次,遍历i+1到最后一个点,判断与第i 个点的关系;
从第2次,遍历i+2到最后一个点,判断与第i 个点的关系;
满足 在相同位置 或 斜率相同 都符合条件

代码:
public class HelloJava {
	public int maxPoints(Point[] points) {
		// 0个点
		if (points.length == 0) {
			return 0;
		}
		//1个点 || 2个点
		if (points.length <= 2) {
			return points.length;
		}
		//多于2个点
		int max=2;
		for(int i=0;i<points.length;i++) {
			int samePosition=0;//相同位置的点
			int sameSlope=1;//相同斜率的点
			for(int j=i+1;j<points.length;j++) {
				int positionX=points[j].x-points[i].x;
				int positionY=points[j].y-points[i].y;
				
				if(positionX==0&&positionY==0) {  //是相同位置
					samePosition++;
				}else {   //是相同斜率
					sameSlope++;
					for(int k=j+1;k<points.length;k++) {
						int positionX2=points[k].x-points[i].x;
						int positionY2=points[k].y-points[i].y;
						if(positionX*positionY2==positionY*positionX2) {
							sameSlope++;
						}
					}
				}
				if(max<samePosition+sameSlope) {
					max=samePosition+sameSlope;
				}
				sameSlope=1;
			}
		}
		return max;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值