题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解决方案
public int minNumberInRotateArray(int [] a) {
int low=0,high=a.length-1,meddle=(low+high)/2;
while(high-low>1){
meddle=(low+high)/2;
if(a[meddle]<a[low]){
high=meddle;
}
if(a[meddle]>=a[low]){
low=meddle;
}
}
return a[high]>a[meddle]?a[meddle]:a[high];
}
简单解释一下:
二分法才能log,暴力太不优雅了。
总之,我的方法是让low和high一起逼近缺口。
最小值左边的一定递不递减,最小值右边同理。
meddle对应值>low时,可以断定最小值还在meddle右边;
同理,meddle对应值