旋转数组的最小数字
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:可知一个该旋转数组的特点是先递增后递减的,故若要得到最小的那个数字,需要找到那个畸变点。我能考虑到的有以下两种做法:
1,从头开始遍历,直至开始遍历找到a[i+1]<a[i]时,a[i+1]为最小数。
2,因为可能旋转的部分很大,畸变点在数组的非常后面,所以为了减少不必要的遍历,采用前后同时遍历来寻找畸变点。
PS:因为题目说为非递减数组,所以可能存在数不增也不减的情况,即全部相同,所以初始min应设置为array[0]。
1 public static int minNumberInRotateArray(int [] array) { 2 if(array.length==0) return 0; 3 int min = array[0]; 4 int i=0,j=array.length-1; 5 for(;i<=j;i++,j--){ 6 if(array[i]>array[i+1]){ 7 min = array[i+1]; 8 break; 9 } 10 if(array[j-1]>array[j]){ 11 min = array[j]; 12 break; 13 } 14 } 15 return min; 16 }