計算圓內最大圓心角(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));
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章