Shirlies
宁静专注认真的程序媛~

题目

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

链接

http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

答案

如果给定的数据是有序的,或者特殊的序列,一般都可以考虑用二分进行查找。这道题就是两个有序的序列,而且前一个序列的值一定大于等于后面的序列的所有值。

特殊情况就是有可能出现全部相同或者部分相同的数据,导致已经无法确定是在序列的左边查找还是右边查找了。这种情况就是顺序遍历。参考案例

代码

 1 class Solution {
 2 public:
 3     int minNumberInRotateArray(vector<int> rotateArray) {
 4         vector<int>::iterator beg = rotateArray.begin();
 5         vector<int>::iterator end = rotateArray.end();
 6         
 7         vector<int>::iterator med = beg;
 8         int firstValue = *beg;
 9         while(*beg >= *(end - 1)){
10             if(end - beg == 1){
11                 return *beg;
12             }
13             
14             if(end - beg - 1 == 1){
15                 return *(end - 1);
16             }
17             
18             med = beg + ((end - beg) >> 1);
19             if(*beg == *(end - 1) && *med == *beg){
20                 int minValue = *beg;
21                 for(med = beg;med < end;++ med){
22                     if(minValue > *med){
23                         minValue = *med;
24                     }
25                 }
26                 return minValue;
27             }
28             
29             if(*med >= *beg){
30                 beg = med;
31             }else if(*med <= *(end-1)){
32                 end = med + 1;
33             }
34         }
35         
36         return *med;
37     }
38 };
View Code

 

posted on 2016-08-16 16:16  Shirlies  阅读(306)  评论(0)    收藏  举报