Q6--旋轉數組的最小數字

一、題目描述

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。

二、解題思路

最簡單的方法是遍歷數組得到最小的元素,算法複雜度是O(N)。但是沒有利用旋轉數組的特性,利用它的特性,我們可以用二分查找的方法降低算法複雜度。我們會發現旋轉後的數組可以分爲兩個部分,前面部分的元素均大於後面部分的元素。那麼我們可以用兩個指針,一個指向頭部,一個指向尾部。如果中間位置的元素大於頭指針指向的元素那麼它處於第一個部分,可以將頭指針移動到中間元素的位置,縮小查找範圍;如果中間位置的元素小於尾指針指向的元素那麼它處於第二部分,那麼將尾指針移動到中間元素的位置來縮小查找範圍。最後如果頭尾指針指向相鄰的元素,那麼尾指針指向的元素就所找的最小數字。

三、Java代碼實現

public class minNumberInRotateArray {

        public static int minNumber(int [] array) {
            if(array==null) return 0;
            int start  = 0;
            int end = array.length - 1;
          //  if(end == 0) return 
            int mid ;
            while(end > start+1){
                mid =  (start + end)/2;
                if(array[mid] >= array[start])
                    start = mid;
                if(array[mid] <= array[end])
                    end = mid;
            }
            return array[end];

        }

        public static void main(String[] args){
            int[] array = {3,4,5,1,2};
            System.out.println(minNumber(array));
        }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章