《剑指offer》面试题8—旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组末尾我们称之为数组的旋转。要求:输入一个递增排序的数组的旋转,输出旋转数组中的最小数字。例如{3,4,5,1,2}是{1,2,3,4,5}的一个旋转,该数组的最小值为1。
思路:旋转后的数组可分为两个有序数组,最小的数恰好是分界点。由于是局部有序的,想到用二分查找的方法去查找最小元素。和二分类似,每次取一个index_mid为中间值,如果该数大于index1则说明最小数在后面;如果该数小于index2,则说明最小数在该数前面或者就是该数。
例外情况:1.旋转了0个数,即数组仍是有序的;2.mid=index1=index2,此时必须暴力求解。
1 #include <iostream> 2 3 using namespace std; 4 5 int MinInOrder(int* array, int index1, int index2) 6 { 7 int min = array[index1]; 8 for(int i=index1+1; i<=index2; i++) 9 { 10 if(array[i] < min) min = array[i]; 11 } 12 return min; 13 } 14 15 int Min(int* array, int length) 16 { 17 int index1 = 0; 18 int index2 = length - 1; 19 int index_mid = index1; 20 21 if(array[index1] < array[index2]) 22 return array[index1]; 23 else 24 { 25 while((index2 - index1) > 1) 26 { 27 index_mid = (index2 + index1)/2; 28 if(array[index1] == array[index2] == array[index_mid]) 29 return MinInOrder(array,index1,index2); 30 else if(array[index1] <= array[index_mid]) 31 index1 = index_mid; 32 else 33 index2 = index_mid; 34 } 35 } 36 return (array[index1]<array[index2])?array[index1]:array[index2]; 37 } 38 39 40 int main() 41 { 42 int length; 43 cout<<"Input the array's length:"<<endl; 44 cin>>length; 45 int* parray = new int[length]; 46 for(int i=0; i<length; i++) 47 { 48 cin>>parray[i]; 49 } 50 cout<<"The min number in array:"<<Min(parray,length)<<endl; 51 return 0; 52 }