把一個數組最開始的若干個元素搬到數組的末尾,咱們稱之爲數組的旋轉。
輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。
NOTE:給出的全部元素都大於0,若數組大小爲0,請返回0。java
實質:二分查找的變形算法
將旋轉數組對半分能夠獲得一個包含最小元素的新旋轉數組,以及一個非遞減排序的數組。新的旋轉數組的數組元素是原數組的一半,從而將問題規模減小了一半,這種折半性質的算法的時間複雜度爲 O(logN)。數組
此時問題的關鍵在於肯定對半分獲得的兩個數組哪個是旋轉數組,哪個是非遞減數組。咱們很容易知道非遞減數組的第一個元素必定小於等於最後一個元素。code
public class Solution { public int minNumberInRotateArray(int [] array) { int low = 0 ; int high = array.length - 1; while(low < high){ int mid = low + (high - low) / 2; if(array[mid] > array[high]){ low = mid + 1; }else if(array[mid] == array[high]){ high = high - 1; }else{ high = mid; } } return array[low]; } }