旋转数组的最小数字

 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 }

 

posted @ 2014-02-20 23:50  CrazyCode.  阅读(219)  评论(0编辑  收藏  举报