计算圆内最大圆心角(Java)

问题描述:
一个圆上有N个点(用圆心正上方的点,顺时针旋转到该点的角度来表达,N可能很大),求其中任意2点与圆心所成圆心角的最大值。输入为N和N个[0,360)的有序float值,输出精确到小数点后一位。
示例:
输入:5 1 23.5 179 180.1 190.2
输出:179.1
我的思路:
因为是求最大角度,可以首先找到离180最近的位置key(大于或者等于180)

  1. 如果所有值都大于或者小于180,那么可以直接输出dots[N-1]-dots[0];
  2. 假设已经找到了key
    若dots[key]-dots[0]<=180,作为最大值候选
    否则dots[key-1]-dots[0]<180,最为最大值候选
  3. 另外一个候选为:
    如果dots[N-1]-dots[key-1] <=180 作为最大值候选
    否者dots[N-1]-dots[key]作为最大值候选

public class Solution3 {
	public int findKey(float[] dots,int start,int end){
		int mid = start+(end-start)/2;
		if(dots[mid] == 180.0)
			return mid;
		if(mid < (dots.length-1) && dots[mid] <180 && dots[mid+1] >180 )
			return mid+1;
		if(mid != dots.length-1 && dots[mid] < 180){
			return findKey(dots, mid+1,end);
		}
		if(mid != 0 && dots[mid] > 180){
			return findKey(dots, start, mid-1);
		}
		return mid;
	}
	
	public float maxAngle(float[] dots, int N){
		int key = findKey(dots,0,N-1);
		if(key == 0 || key == N-1) {
			return dots[N-1]-dots[0];
		}
		
		float max = 0.0f;
		if(dots[key] - dots[0]<=180 && (dots[key]-dots[0])>max)
			max = dots[key] - dots[0];
		else if(dots[key-1]-dots[0] > max)
			max = dots[key-1]-dots[0];
		
		if(dots[N-1]-dots[key-1]<=180 && dots[N-1]-dots[key-1] > max)
			max = dots[N-1]-dots[key-1];
		else if(dots[N-1] - dots[key] > max)
			max = dots[N-1]-dots[key];
		
		return max;
	}

	public static void main(String[] args) {
		//float[] dots = {1,	23.5f, 179,	180.1f,	190.2f};
		//float[] dots = {1,2,4,67,89,145,158.9f,179.2f};
		//float[] dots = {181,206,267,345,359};
		//float[] dots = {1,179,185,357};
		//float[] dots = {1,179,185,359};
		float[] dots = {1,181,238,267,289,315,325,339,357,358,359};
		Solution3 so3 = new Solution3();
		System.out.println(so3.maxAngle(dots,dots.length));
	}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值