1 #include "stdafx.h" 2 #include <iostream> 3 #include <exception> 4 #include <stack> 5 using namespace std; 6 7 /* 8 旋转数组的最小数字 9 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转,输入 10 一个递增排序的数组的一个旋转。输出旋转数组的最小元素。例如数组{3,4,5,1,2} 11 为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 12 思路:遍历一遍找最小值.时间复杂度显然是O(n),这个思路显然达不到要求. 13 */ 14 15 int Min(int *arr,int beg,int end) 16 { 17 18 if(arr==NULL) 19 throw new std::exception("Invalid parameters"); 20 if(arr[beg]<arr[end]) 21 { 22 return arr[beg]; 23 } 24 25 int mid =(beg+end)/2; 26 if(arr[mid]==arr[beg]&&arr[beg]==arr[end]) 27 { 28 int result = arr[beg]; 29 for(int i = beg;i<=end;i++) 30 { 31 if(result>arr[i]) 32 result = arr[i]; 33 } 34 return result; 35 } 36 if(beg+1==end) 37 { 38 return arr[end]; 39 } 40 41 if(arr[mid] < arr[beg]) 42 { 43 return Min(arr,beg,mid); 44 } 45 if(arr[mid] > arr[end]) 46 { 47 return Min(arr,mid,end); 48 } 49 return -1; 50 } 51 52 int _tmain(int argc, _TCHAR* argv[]) 53 { 54 int arrlist[] = {2,3,4,5,6,7,1}; 55 //int arrlist[] = {1,0,1,1,1}; 56 //int arrlist[] = {1,1,1,0,1}; 57 int len = sizeof(arrlist)/sizeof(int); 58 cout<<Min(arrlist,0,len-1)<<endl; 59 return 0 ; 60 }