package Code01;
import java.util.Arrays;
public class CodePractice {
// 局部最小值问题 二分
// 数列无序 任意两个相邻的两个数不相等
// 返回一个局部最小值
public static int oneMinIndex(int[] arr){
if(arr == null || arr.length==0){
return -1;
}
int N = arr.length;
if(N == 1){
return 0;
}
if(arr[0] < arr[1]){
return 0;
}
if(arr[N-1] < arr[N-2]){
return N-1;
}
int L = 0;
int R = N-1;
while (L < R-1) {
int mid = (L+R)/2;
if(arr[mid]< arr[mid-1] && arr[mid] < arr[mid+1]){
return mid;
}
else if(arr[mid] > arr[mid-1]){
R = mid-1;
}
else {
L = mid+1;
}
}
return arr[L] < arr[R] ? L : R;
}
// 验证是否为局部最小
public static boolean test(int[] arr, int minIndex){
if(arr.length==0){
return minIndex == -1;
}
int left = minIndex-1;
int right = minIndex+1;
boolean leftBigger = left >= 0 ? arr[left] > arr[minIndex] : true;
boolean rightBigger = right < arr.length ? arr[right] > arr[minIndex] : true;
return leftBigger && rightBigger;
}
// 生成随机数组且相邻数不相等
public static int[] randomArray(int maxLen, int maxValue){
int len = (int)(Math.random()*maxLen);
int[] arr = new int[len];
if(len > 0){
arr[0] = (int)(Math.random()*maxValue);
for(int i=1;i<len;i++){
do{
arr[i] = (int)(Math.random()*maxValue);
}while (arr[i] == arr[i-1]);
}
}
return arr;
}
public static void print(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void main(String[] args){
int maxLen = 50;
int maxValue = 200;
int testTimes = 10000;
System.out.println("测试开始");
for(int i=0;i<testTimes;i++){
int[] arr = randomArray(maxLen, maxValue);
int ans = oneMinIndex(arr);
if(!test(arr, ans)){
print(arr);
System.out.println(ans);
break;
}
}
System.out.println("测试结束");
}
}
java 二分查找局部最大值
最新推荐文章于 2024-07-27 17:56:15 发布