旋转数组求最小值
看的网上有个叫做旋转数组的东西,所以查了查.所谓旋转数组就是把一个有序数组转动n位得到的一个东西.例如下图旋转后的a数组
一共查到了两个问题
1.把一个有序数组按照一个长度,旋转 m.获得一个旋转数组 http://blog.csdn.net/lalor/article/details/7961323 这个帖子没看明白c++的rotate怎么就高效了???
2.旋转数组求最小值 http://zhedahht.blog.163.com/blog/static/25411174200952765120546/
试着写了一下用二分法求最小值的代码, 没有保证一次成功,编译后通过了.但是总有种食之无味,弃之可惜的感觉.....
1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 5 using namespace std; 6 7 int getMinist(const int* const sp, const int length) 8 { 9 int begin = 0; 10 int end = length -1; 11 int middle = (begin + end) / 2; 12 13 for (int i = 0; i <= length; i++) //当循环了length次都没结束的话,说明代码写错啦,否则不可能找不到 14 { 15 if (begin > end) //一直没找到, 16 { 17 return -2; 18 } 19 else //只有sp[middle]的值比左边小(如果有),同时sp[middle]的值比右边小(如果有) 20 { 21 if ( (middle == 0) && (middle + 1 < length - 1) ) //middle在最左边 22 { 23 if (sp[middle] < sp[middle+1]) 24 return sp[middle]; 25 } 26 else if ( (middle == length - 1) && (middle - 1 >= 0) ) //middle在最右边 27 { 28 if (sp[middle] < sp[middle-1]) 29 return sp[middle]; 30 } 31 else //middle在中间 32 { 33 if ( (sp[middle] < sp[middle-1]) && (sp[middle] < sp[middle+1]) ) 34 return sp[middle]; 35 } 36 } 37 38 if ( sp[middle] >= sp[end] ) //sp[middle] 比最右边的大,就移动begin 39 { 40 begin = middle + 1; 41 } 42 else if (sp[middle] < sp[end]) //sp[middle] 比最左边大端小,就移动end 43 { 44 end = middle -1; 45 } 46 47 middle = (begin+end) / 2; 48 }//for 49 50 return -1; 51 } 52 53 int main(int argc, char** argv) 54 { 55 int arry1[] = {9,8,7,6,1,2,3,4,5,6}; 56 int arry2[] = {9,8,7,6,5,4,1,2,3}; 57 int arry3[] = {1,2,3,4}; 58 int arry4[] = {9,8,7,6,5,4,3,2,1}; 59 60 cout<<getMinist(arry1,sizeof(arry1)/sizeof(arry1[0]))<<endl; 61 cout<<getMinist(arry2,sizeof(arry2)/sizeof(arry2[0]))<<endl; 62 cout<<getMinist(arry3,sizeof(arry3)/sizeof(arry3[0]))<<endl; 63 cout<<getMinist(arry4,sizeof(arry4)/sizeof(arry4[0]))<<endl; 64 return 0; 65 }