在一个无序数组中,任意相邻两数不等,求一个局部最小值?
先来看什么是局部最小,假设数组长度是N
- 0位置的数比1位置的数小,0位置的数就是局部最小
- N-1位置的数比N-2位置的数小,N-1位置的数就是局部最小
- 任何一个中间的位置i,既要比i-1位置的数小,又要比i+1位置的数小,i位置的数才是局部最小
package com.harrison.class01;
/**
* @author Harrison
* @create 2022-01-21-21:06
* @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
*/
public class Code07_BSAwesome {
public static int getLocalLessIndex(int[] arr){
if(arr==null || arr.length==0){
return -1;
}
if(arr.length==1 || arr[0]<arr[1]){
return 0;
}
if(arr[arr.length-1]<arr[arr.length-2]){
return arr.length-1;
}
int L=1;
int R=arr.length-2;
int mid=0;
while(L<R){
mid=L+((R-L)>>1);
if(arr[mid]>arr[mid-1]){
R=mid-1;
}else if(arr[mid]>arr[mid+1]){
L=mid+1;
}else{
return mid;
}
}
return L;
}
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) (Math.random() * (maxSize + 1))];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * (maxValue + 1))-(int) (Math.random() * maxValue);
}
return arr;
}
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr=generateRandomArray(20,20);
printArray(arr);
System.out.println(getLocalLessIndex(arr));
}
}
**所以,二分的问题不一定要求数据有序才能进行,而是要看数据状况是怎样的,
(数据状况特殊 || 问题定义很奇葩) 只要能够构建出一种排他性就可以有效利用二分。**
更多二分系列文章,请看下面博客: