题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
链接
答案
如果给定的数据是有序的,或者特殊的序列,一般都可以考虑用二分进行查找。这道题就是两个有序的序列,而且前一个序列的值一定大于等于后面的序列的所有值。
特殊情况就是有可能出现全部相同或者部分相同的数据,导致已经无法确定是在序列的左边查找还是右边查找了。这种情况就是顺序遍历。参考案例。
代码
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 };
浙公网安备 33010602011771号