二分法。有时候数组无序,同样可以采用二分法。这道题考察的是全局观,左边下降趋势,右边上升趋势,函数图像呈凹形,必有极小值。中左值和中值呈上升趋势,中值右边可以直接舍弃;中值和中右值呈下降趋势,中值左边可以直接舍弃。
public class LocalMin {
public LocalMin(int[] arr){
int length = arr.length;
if(length == 0){
System.out.println("数组为空!");
return;
}
if(arr[0] < arr[1] || length == 1){
System.out.println("其中一个局部最小值为0位置:" + arr[0]);
return;
}
if(arr[length-1] < arr[length-2]){
System.out.println("其中一个局部最小值为" + (length-1) +"位置:" + arr[length-1]);
return;
}
int left = 0;
int right = length-1;
while(left < right){
int mid = (int)(left + ((right - left) >>1)) + 1;
if(arr[mid] > arr[mid-1]){
right = mid -1;
}
else if(arr[mid] > arr[mid+1]){
left = mid+1;
}
else{
System.out.println("数组其中一个局部最小是" + mid + "位置:" + arr[mid]);
return;
}
}
}
public static void main(String []args){
int [] arr = new int[] {24,2,3,4,5,6,9,8,10,12,13};
LocalMin localmin = new LocalMin(arr);
}
}