面试题8:旋转数组的最小数字
//面试题8:旋转数组的最小数字
//递增排序的{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); } }