package day01; public class Suan03DBPartMIn { /** * 上一篇是二分法对有序数组的操作,难道二分法只能做有序数组的题吗 * 答案是否定的,如下: * 首先明确局部最小定义;只要比两边的数小就可以称之为局部最小 * 题目:返回无序数组中的局部最小(一个就可) * * */ public static int func(int[] arr){ if(arr.length==0||arr==null){ //即不存在 return -1; } if(arr[0]<arr[1]){ //即0就是局部最小 return 0; } if(arr[arr.length-2]>arr[arr.length-1]) //即最后一位局部最小 return arr.length-1; //定义都相同 int head = 0; int tail = arr.length-1; int mid = 0; while(head<tail){ mid = head+((tail-head)>>1); if(arr[mid]>arr[mid-1]){ //中间值比左边的大的话,局部最小值肯定在head和mid之间 tail = mid-1; }else if(arr[mid]>arr[mid+1]){ //中间值比右边大的话,局部最小值肯定在mid和tail之间 head = mid+1; }else{ return mid; } } if(arr[0]<arr[1]){ //即0就是局部最小 return 0; } if(arr[arr.length-2]>arr[arr.length-1]) //即最后一位局部最小 return arr.length-1; return -1; } public static int[] RandomTest(int sizeMax,int valueMax){ int[] arr = new int[(int)(Math.random()*(sizeMax+1))+4]; for (int i = 0; i < arr.length; i++) { arr[i] = (int)(Math.random()*(valueMax+1))-(int)(Math.random()*(valueMax)); } return arr; } public static void main(String[] args) { int sizeMax = 10; int valueMax = 100; int[] arr = RandomTest(sizeMax,valueMax); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]+" "); } System.out.println("\n"+func(arr)); System.out.println("\n"+arr[func(arr)]); } }