package class01.question01;
public class BiLocalMinimum {
public static int biLocalMinimum(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 left = 1;
int right = arr.length - 2;
while(left < right) {
int mid = left + ((right - left) >>1 );
if (arr[mid] > arr[mid - 1] ) {
right = mid - 1;
} else if (arr[mid] > arr[mid + 1]) {
left = mid + 1;
}else {
return mid;
}
}
return left;
}
public static boolean isRight(int[] arr,int index) {
if (arr.length <= 1) {
return true;
}
if (index == 0) {
return arr[index] < arr[index + 1];
}
if (index == arr.length - 1) {
return arr[index] < arr[index-1];
}
return arr[index] < arr[index + 1] && arr[index] < arr[index - 1];
}
public static int[] generateRandomArray(int maxSize,int maxValue) {
int[] arr = new int[(int) (Math.random() * maxSize) + 1];
arr[0] = (int) (Math.random() * maxValue) - (int) (Math.random() * maxValue);
for (int i = 1;i < arr.length;i++) {
do {
arr[i] = (int) (Math.random() * maxValue) - (int) (Math.random() * maxValue);
}while (arr[i] == arr[i-1]);
}
return arr;
}
public static void printArray(int[] arr) {
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
public static void main(String[] args) {
int maxSize = 100;
int masValue = 100;
int testTime = 10000;
for (int i = 0; i < testTime; i++) {
int[] arr = generateRandomArray(maxSize, masValue);
int localMinimumIndex = biLocalMinimum(arr);
if (!isRight(arr,localMinimumIndex)) {
printArray(arr);
System.out.println("fail");
return;
}
}
System.out.printf("success");
}
}