题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路
可以直接遍历找最小,还有就是基于二分查找,比如例子3、4、5、1、2,如果中间元素5大于最左面3则说明从最左到中间是递增的,所以最小的元素在中间往右的区间;
如例子5、1、2、3、4 如果中间元素2小于最左,则说明最小元素在中间往左的区间(以上均可能包括中间元素)不过这样写会有点问题,最后left和right指针后挨着,然后一直循环找不到结果,所以当left+1=right时候单独判断一下哪个小。
code:
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int left=0;
int right=rotateArray.size()-1;
if(rotateArray.size()==0)
return 0;
while(1){
int mid=(right+left)/2;
if(rotateArray[mid]<rotateArray[left]){
right=mid;
}
if(rotateArray[mid]>rotateArray[right]){
left=mid;
}
if(right==left+1){
if(rotateArray[left]<rotateArray[right])
return rotateArray[left];
else
return rotateArray[right];
}
}
}
};