46.旋转数组的最小数字(82)
-
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。0,1,1,1,1=>1,1,1,0,1;0,1,1,1,1=>1,0,1,1,1。
-
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
-
思路:旋转数组相当于两个有序的数组({1,2,3,4} 例外),可以通过二分查找找到第一个数组的最大值以及第二个数组的最小值。
-
代码:
package _46.旋转数组的最小数字; public class MinNumOfReverseArray { public static int minNumberInRotateArray(int [] array) { if(array == null || array.length == 0) return -1; int start = 0; int end = array.length - 1; int mid = 0;//当数组数有序的时候直接返回第一个元素,{1,2,3,4} while(array[start] >= array[end]){ if((start + 1) == end){ mid = end; break; } else{ mid = (start + end)/2; //当第一个元素、最后一个元素、中间元素三个数一致时,只能采用顺序查找。 if(array[start] == array[end] && array[mid] == array[start]){ return searchMin(array,start,end); } //要查找的元素在中间元素之后 if(array[mid] >= array[start]){ start = mid; } //要查找的元素在中间或者中间元素之前 else if(array[mid] <= array[end]){ end = mid; } } } return array[mid]; } //顺序查找数组中值最小的元素 public static int searchMin(int[] array,int start,int end){ int min = 0; for(int i = start; i <= end; i++){ if(min > array[i]){ min = array[i]; } } return min; } public static void main(String[] args) { int minNumberInRotateArray = minNumberInRotateArray(new int[]{1,1,1,0,1}); System.out.println(minNumberInRotateArray); } }