剑指 Offer 11. 旋转数组的最小数字
旋转之后分为两段 ,其中两端仍然按照排列顺序。最小段总在右边,所以我们将中点值与右端点进行比较。情况分为三种:
1) 当查找mid 在 第一段递增最高端 也就是 **arr[mid] > arr[right]**时 : 往右查找。
2 ) 当**arr[mid] < arr[right]**时 证明已经在右侧最小段
3) 当**arr[mid] =arr[right]**时 在右半段,此时需要往左边进行二分查询。
class Solution {
public int minArray(int[] numbers) {
return binarySearch(numbers,0,numbers.length-1);
}
public int binarySearch(int[] a , int l , int r ){
if(l>r) return a[l];
int mid = (l+r) /2;
if(a[mid] > a[r]) return binarySearch(a , mid + 1 , r );
else if(a[mid] < a[r]) return binarySearch(a , l , mid );
else return binarySearch(a,l,--r);
}
}