面试题十一:旋转数组的最小数字
把一个有序数组前面若干个数搬到后面,求数组中最小值
方法一:顺序查找最小值 O(n)
方法二:利用该序列的特殊性,使用二分查找
static int min(int [] array){ if(array==null||array.length<=0){ return -1; } int L=0; int R=array.length-1; int index=L; //防止第一个数就是最小的情况 while( array[index]>=array[R]) //旋转后的特性,第一个比最后一个大,否则第一个最小 { if(R-L==1){ index=R; break; } index=(L+R)>>1; //如果三值相同则无法判断,只能顺序查找 if(array[L]==array[R]&&array[L]==array[index]){ int Min=array[L]; for(int i=L;i<=R;i++){ if(array[i]<Min) Min=array[i]; } return array[Min]; } //否则 if(array[index]>=array[L]) //左边有序,最小值在右边 L=index; else if(array[index]<=array[R])// 右边有序,最小值在左边 R=index; } return array[index]; }
浪波激泥