旋转数组求最小值

看的网上有个叫做旋转数组的东西,所以查了查.所谓旋转数组就是把一个有序数组转动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 }

 

转载于:https://www.cnblogs.com/silentNight/p/5456541.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值