题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解法1:
思路:直接遍历(不思考题目意思的解法)
1 public int minNumberInRotateArray(int [] array) { 2 if(array.length==0) 3 return 0; 4 int Min_array=Integer.MAX_VALUE; 5 for(int i=0;i<array.length;i++) { 6 if(array[i]<Min_array) 7 Min_array=array[i]; 8 } 9 return Min_array; 10 }
解法2:
思路:由于旋转数组中的数字大小顺序是有规律可循的,观察一下即可得知:可以将旋转数组看成两个有序递增数组,即可以用二分法来解决。
1 public int minNumberInRotateArray(int [] array) { 2 3 if(array.length==0) 4 return 0; 5 int low=0; 6 int high=array.length-1; 7 while(low<high) { 8 int mid=low+(high-low)/2; 9 if(array[mid]>array[high]) { 10 low=mid+1; 11 }else if(array[mid]==array[high]) { 12 high-=1; 13 }else { 14 high=mid; 15 } 16 } 17 return array[low]; 18 }