【题目】旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回null。
1 /** 2 * 旋转数组的最小数字 3 * 4 * @author Administrator 5 * 6 * 测试用例: null 1 1,2,3,4,5 3,4,5,1,2 1,0,1,1,1 1,1,1,0,1 2,3,4,5,1,2,2,2 7 * 8 * 时间复杂度:O(logn) 9 */ 10 public class Main { 11 12 public static void main(String args[]) { 13 14 int[] array = { 2, 3, 4, 5, 1, 2, 2, 2 }; 15 16 Main main = new Main(); 17 18 System.out.println("min num: " + main.getMinNum(array)); 19 } 20 21 private Integer getMinNum(int[] array) { 22 23 if (null == array || 0 == array.length) { 24 return null; 25 } 26 27 if (array.length == 1) { 28 return array[0]; 29 } 30 31 int head = 0; 32 int tail = array.length - 1; 33 int middle = 0; 34 35 if (array[head] < array[tail]) { 36 return array[head]; 37 } 38 39 while (tail - head > 1) { 40 41 middle = (head + tail) / 2; 42 43 // 头 尾 中间元素值相同,无法判断指针的移动方向,转为顺序查找 44 if (array[head] == array[middle] && array[middle] == array[tail]) { 45 return minOrder(array, head, tail); 46 } 47 48 // 中间元素值大于头元素值,头指针移动到中间位置 49 if (array[head] <= array[middle]) { 50 head = middle; 51 continue; 52 } 53 54 // 中间元素值小于尾元素值,尾元素移动到中间位置 55 if (array[tail] >= array[middle]) { 56 tail = middle; 57 continue; 58 } 59 } 60 61 return array[tail]; 62 } 63 64 private Integer minOrder(int[] array, int head, int tail) { 65 66 int minNum = array[head]; 67 68 for (int i = head; i <= tail; i++) { 69 if (array[i] < minNum) { 70 minNum = array[i]; 71 } 72 } 73 74 return minNum; 75 } 76 }