問題描述:
一個圓上有N個點(用圓心正上方的點,順時針旋轉到該點的角度來表達,N可能很大),求其中任意2點與圓心所成圓心角的最大值。輸入爲N和N個[0,360)的有序float值,輸出精確到小數點後一位。
示例:
輸入:5 1 23.5 179 180.1 190.2
輸出:179.1
我的思路:
因爲是求最大角度,可以首先找到離180最近的位置key(大於或者等於180)
- 如果所有值都大於或者小於180,那麼可以直接輸出dots[N-1]-dots[0];
- 假設已經找到了key
若dots[key]-dots[0]<=180,作爲最大值候選
否則dots[key-1]-dots[0]<180,最爲最大值候選 - 另外一個候選爲:
如果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));
}
}