// 1.局部最小值问题 保证相邻的连个数不相等 可以找到一个 public static int localMinIndex(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 { // 左边>mid mid > 右边 // 左边< mid mid>右边 // 左边<mid mid< 右边 if (arr[mid-1] < arr[mid]){ R=mid-1; }else { L=mid+1; } } } return arr[L]<arr[R] ? L:R; }
//2.生成数组 相邻的两个数不相等 public static int[] generayeArray(int maxlen,int maxValue){ int len= (int)(Math.random()*maxlen); int[] arr=new int[len]; if (arr.length>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; } //3.局部最小的校验函数 public static Boolean check(int[] arr,int mid){ if ( null == arr || arr.length ==0){ return mid == -1; } int chekL=mid-1; int chekR=mid+1; Boolean left=chekL >=0 ? arr[chekL]>arr[mid] : true; Boolean Right=chekR<arr.length ? arr[mid]< arr[chekR] : true; return left && Right; }
//4. 测试
public static void main(String[] args) { int testTime = 500000; int maxSize = 10; int maxValue = 100; for (int i = 0; i < testTime; i++) { int[] arr = generayeArray(maxSize, maxValue); //获得局部最小 int ans = localMinIndex(arr); if ( !check(arr,ans)){ System.out.println("测试出错!!!!!"); System.out.println(Arrays.toString(arr)); System.out.println(ans); break; } } System.out.println("测试结束!!!!"); }