把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
java解法(牛客网通过):
1 import java.util.ArrayList; 2 public class Solution { 3 public int minNumberInRotateArray(int[] array) { 4 int len = array.length; 5 if(array == null||len <1){ 6 return 0; 7 } 8 int index1 = 0; 9 int index2 = len - 1; 10 int indexMid = index1; 11 while(array[index1] >= array[index2]){ 12 if(index2 - index1 ==1){ 13 indexMid = index2; 14 break; 15 } 16 indexMid = (index1 + index2)/2; 17 18 19 if(array[index1] == array[index2]&&array[indexMid] == array[index1]) 20 return MinInOrder(array,index1,index2); 21 if(array[indexMid] >= array[index1]) 22 index1 = indexMid; 23 if(array[indexMid] <= array[index2]) 24 index2 = indexMid; 25 26 } 27 return array[indexMid]; 28 29 } 30 31 public int MinInOrder(int[] array,int index1,int index2){ 32 int result = array[index1]; 33 for(int i = index1 + 1;i<index2;i++){ 34 if(result > array[i]) 35 result = array[i]; 36 } 37 return result; 38 } 39 }
MinInOrder()函数主要是处理特殊情况,当数组为{1,0,1,1,1}和{1,1,1,0,1}时,array[index1]=array[index2]=array[indexMid],因此无法确定中间数字1是否属于第一个还是第二个递增数组,此时当两个指针指向的数字及中间的数字三者相同的时候,无法判断中间数字是位于哪个数组中,也就无法通过移动指针来缩小查找范围,因此不得不用顺序查找的方法
此题是二分查找的变形,因此要利用二分查找法实现O(logn)的查找。