如图所示。
当出现三种情况的时候存在局部最小值。
1、mid<left 并且mid<right 此时mid为局部最小。
2、mid<left 但是mid>right 此时mid——L 或者mid——R 中间存在局部最小
3、mid>left 但是mid<right 此时mid——L 或者mid——R 中间存在局部最小
我们可以先考虑一些特殊边界条件
1、为空时候直接返回 不存在
2、一个元素就是局部最小直接返回
3、第二个元素小于第一个元素 返回第二个元素
4、倒数第二个元素小于倒数第一个元素 返回倒数第二个元素
正常情况条件考虑
mid>mid-1的值此时为上图3所示 。所以L-mid存在局部最小 R可以来到mid-1位置
mid>mid+1的值此时为上图而所示。所以mid-R存在局部最小 L可以来到mid+1位置
否则情况为图一直接返回mid即可
//局部最小
public static void main(String[] args) {
int [] arr = {1123,2,34,31,3,23,5,23};
int index = bSAwesome(arr);
System.out.println(index);
}
private static int bSAwesome(int[] arr) {
//空集合返回
if (null==arr || arr.length==0) {
return -1;
}
//一个元素直接返回
if (arr.length<2) {
return 0;
}
//1下标大于0下标
if (arr[0]>arr[1]) {
return 1;
}
//最后两位比较
if (arr[arr.length-1]>arr[arr.length-2]) {
return arr.length-2;
}
int mid = 0;
int L = 0;
int R = arr.length-1;
while (L<R){
// mid >前面
if(arr[mid]>arr[mid-1]){
R = mid-1;
}else if(arr[mid]>arr[mid]+1){
L = mid+1;
}else{
return mid;
}
}
return L;
}