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 }