旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输
出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
可以利用二分法查找,当start<=mid的时候,则最小值应当在mid和end之间,否则应该在start和mid之间。
另外,如果start==mid==end,则无法判断最小值在哪个区间,就只有顺序查找了。
public int minNumberInRotateArray(int [] array) { if(array.length<=0){ return 0; }else if(array[0]<array[array.length-1]){ return array[0]; } return divide(array,0,array.length-1); } private int divide(int[] array,int start,int end){ if(end-start==1){ return array[end]; }else{ int mid=(start+end)/2; if(array[start]==array[end]&&array[start]==array[mid]){//无法确定最小值在哪个区间,只能顺序查找 return minInorder(array); } if(array[start]<=array[mid]){ return divide(array,mid,end); }else{ return divide(array,start,mid); } } } private int minInorder(int [] array){ int min=array[0]; for(int i=0;i<array.length;i++){ if(min>array[i]){ min=array[i]; } } return min; }