旋转数组的最小数字
题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例 1:
输入:[3,4,5,1,2]
输出:1
示例 2:
输入:[2,2,2,0,1]
输出:0
解答:
技巧性比较强,很容能够得到复杂度O(n)的方法,通过比较前后两个元素,如果前一个大于后一个,那么后一个元素即为最小值;最优的方法可以看如下规律:比如数组1234567,可以有以下:
7123456、6712345、5671234、4567123、3456712、2345671;可以看到中间的那个值能将要查的范围缩短为一半,看前面还是右面能保序,注意中间的值可能为所求最小值;终止条件为只剩下两个元素时,位置较高的那个元素即为所求,整个过程相当于二分查找复杂度O(log2n)。这道题如果不把这些情况列出来分析下,不容易想到二分可以解决。
1 public class Solution { 2 public int minNumberInRotateArray(int [] array) { 3 if(array.length == 0){ 4 return 0; 5 } 6 int low = 0, high = array.length - 1; 7 while(low < high){ 8 if(high - low == 1){ 9 break; 10 } 11 int mid = (low + high) / 2; 12 if(array[mid] > array[high]){ 13 low = mid; 14 }else{ 15 high = mid; 16 } 17 } 18 return array[high]; 19 } 20 }