题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
思路
二分查找,l指针指向数组头,r指针指向数组尾。如果mid值>l值,则说明最小值要在mid右面,故将l=mid;若mid值>r值,则说明最小值在mid左面,故将r=mid。
以上为普遍情况,但如果出现如【1,0,1,1,1】这种情况:l,r,mid都相同,就只能顺序查找了。
代码
public class Eleven {
public int bs(int a[]) throws Exception {
if(a.length==0)
throw new Exception("空数组");
int l=0,r=a.length-1;
int mid=0;
while(a[l]>=a[r]) {
mid = (l+r)/2;
if(r-l==1) {
mid=r;
break;
}
//当l,mid,r三个节点值相同时,只能顺序查找
if(a[l]==a[mid]&&a[mid]==a[r]) {
int result = bssp(a,l,r);
return result;
}
else if(a[mid]>a[l])
l=mid;
else if(a[mid]<a[r])
r=mid;
}
return a[mid];
}
private int bssp(int a[],int l,int r) {
int result = a[l];
for(int i=l;i<=r;i++)
if(a[i]<result)
result = a[i];
return result;
}
}