二分法解决局部最小值问题
局部最小值问题:(不一定是有序才可以二分的,具有排它性就可以二分)
局部最小就是改数的左侧和右侧的数都比自己大,当然如果位于两端的话,就只考虑一侧。找到有一个这样的数就可以。
一个数组中,小于m的数都在左边,大于m的数都在右边,找出最右边的一个小于m的数。(具有排他性)
思考
在两端,如果左侧是降,右侧是升,那么根据零点定理,中间必定有局部最小值点,所以就取中间找,这时候用二分,取中点,如果中点是升的,那么局部极小点必定在左侧,如果左侧是降的,那么必定在右侧。
code
int getLessIndex(int [] arr){
if(arr == null || arr.length == 0){
return -1; // no exist
}
if(arr.length == 1 || arr[0] < arr[1]){
return 0;
}
if(arr[arr.length-1] < arr[arr.length - 2]){
return arr.length - 1;
}
int left = 1;
int right = arr/length - 2;
int mid = 0;
while(left < right){
mid = left + (right-left)>>1; // mid = (left++right)/2,用位运算可以防溢出
if(arr[mid] > arr[mid-1]){
right = mid - 1;
}
else if(arr[mid] > arr[mid+1]){
left = mid + 1;
}
else{
return mid;
}
}
return left;
}