【11. 旋转数组的最小数字】剑指offer-JAVA实现

123 阅读1分钟

题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。

思路

二分查找,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;
	}
}