//递增排序的{1,2,3,4,5}----->旋转为 {3,4,5,1,2}
//求最小的数字
package com.hb.jzoffer;
import offer.utilities.ArrayUtils;
//面试题8:旋转数组的最小数字
//{1,2,3,4,5}----->旋转为 {3,4,5,1,2}
publicclass MinNumberInRotatedArray_8 {
public int Min(int[] array ) throws Exception{
int length = array.length ;
if(length < 0){
Exception e = new Exception();
throw e;
}
int index1 = 0 ;
int index2 = length - 1;
int indexMid = index1 ; //如果下面while循环里面的不成立,说明数组是有序的,没有旋转,所以indexMid初始化为Index1
while(array[index1] >= array[index2]){
if(index2 - index1 == 1){
indexMid = index2;
break ;
}
indexMid = (index1 + index2) / 2 ;
//如果下标为index1 、index2 和 indexMid 指向的三个数字相等,
//则只能用书序查找
if(array[index1] == array[index2] && array[indexMid] == array[index1]){
return MinInOrder(array , index1 , index2);
}
if(array[indexMid] >= array[index1]){
index1 = indexMid ;
}else if(array[indexMid] <= array[index2]){
index2 = indexMid ;
}
}
return array[indexMid];
}
public int MinInOrder(int[] array , int index1 , int index2){
int result = array[index1];
for(int i = index1 + 1 ; i <= index2 ; i++){
if(result > array[i]){
result = array[i] ;
}
}
return result;
}
public static void main(String[] args) throws Exception {
int[] array = {3,4,5,1,2};
int[] array1 = {1,1,1,0,1};
MinNumberInRotatedArray_8 findMid = new MinNumberInRotatedArray_8();
int min = findMid.Min(array);
int min1 = findMid.Min(array1);
ArrayUtils.printArray(array);
System.out.println(min);
ArrayUtils.printArray(array1);
System.out.println(min1);
}
}