剑指offer
1.剑指 Offer 11. 旋转数组的最小数字
//1.时间复杂度O(n)
public int minArray(int[] numbers) {
if(numbers == null || numbers.length == 0) return -1;
for(int i = 0;i < numbers.length - 1;i ++){
if(numbers[i] > numbers[i + 1]){
return numbers[i + 1];
}
}
return numbers[0];
}
//2.二分法查找
/**
* 整个数组必然可以分为左排序数组和右排序数组,并且左排序数组中
* 的每个数一定大于右排序数组的每个数
* @param numbers
* @return
*/
public int minArray2(int[] numbers) {
int left = 0,right = numbers.length - 1;
//这里改成left<=right也是可以的
while(left < right){
int mid = left + (right - left) / 2;
if(numbers[mid] > numbers[right]){
left = mid + 1;
}else if(numbers[mid] < numbers[right]){
right = mid;
}else{
//如果发现中间值和右边值相等,右边范围缩小1
right = right - 1;
}
}
return numbers[left];
}