问题描述:
一个圆上有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));
}
}