把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
第一种思路是:从数组的第一个元素开始看,找到第一个前一个元素比后一个元素大的下标,返回下标值+1所对应的数组元素中的值。时间复杂度:O(n)
public int getMin(int[] array){ int i=0; for(;i<array.length;i++){ if(array[i]>array[i+1]){ break; } } return array[i+1]; }
第二种思路是:运用二分查找的思路来做这件事。先找到数组的中间值,然后和数组的第一个和最后一个元素比较,通常第一个元素都是大于最后一个元素的,若中间元素值大于前面的元素,则最小值肯定在后面的部分,将前面的下标赋给中间小标,若中间的元素值比后面的元素值小,则将后面的元素值赋值给中间的元素。最后,中间的元素值可能等于前面的元素,也可能等于后面的元素,此时,不能判定最小值是在哪一部分,所以需要用顺序法,从头开始判断,找到最小的值。
public int minNumberInRotateArray(int [] array) { if(array[0]<array[array.length-1] || array.length==1){ return array[0]; } int n = array.length; int low = 0; int high = n-1; while(high-low!=1){ int mid = low+(high-low)/2; if(array[mid] == array[low] && array[mid] == array[high]){ return getShunxu(array); } if(array[mid]>=array[low]){ low = mid; }else{ high = mid; } } return array[high]; } public int getShunxu(int[] array){ int min = array[0]; for(int i=1;i<array.length;i++){ if(array[i]<min){ min = array[i]; } } return min; }