题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例1:
输入:[3,4,5,1,2]
输出:1
示例2:
输入:[2,2,2,0,1]
输出:0
这里的思路是找出旋转点,旋转点就是最小值,而且整体数组是一个递增排序的数组。
那么此处采用二分法来找
python 版本
class Solution(object):
def minArray(self,numbers):
start,end=0,len(numbers)-1
while(start<end):
mid=(start+end)//2
if(numbers[mid]>numbers[end]): start=mid+1
elif (numbers[mid]<numbers[end]):end=mid
else:
return min(numbers[start:end])
return numbers[start]
C++版本
class Solution{
public:
int minArray(vector<int> numbers){
int start=0,end=numbers.size()-1;
while(start<end){
int mid=(start+end)/2;
if(numbers[mid]<numbers[end]){
end=mid;
}
else if(numbers[mid]>numbers[end){
start=mid+1;
}
else{
int x = start;//1
for(int k=start+1;k<end;k++){
if(numbers[k]<numbers[x]) x=k;
}
return numbers[x];
}
}
return numbers[start];
}
};
注解1:当两个指针值相同,则无法判定m在左数组还是右数组。而遇到这种情况,直接采用线性查找。