天天看點

劍指offe系列之6:旋轉數組的最小值

題目描述:把一個數組最開始的若幹個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個非遞減序列的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。

思路:旋轉之後的數組實際上劃分為兩個排序的子數組,而且前面的子數組的元素都大于或者等于後面子數組的元素。而且最小的元素剛好是這兩個子數組的分界線,在排序數組中可以采用二分查找的方法來實作。

public class MinNumberInRotatedArray {
    public int search(int[] array){
            //當數組為空或者長度為0的時候傳回0
            if(array == null || array.length <=){
                return ;
            }
            //數組不為空且數組的長度大于0
            int low = ;
            int high = array.length - ;
            int mid = low;
            while(array[low] >= array[high]){
                //兩個元素
                if(high - low == ){
                    return array[high];
                }
                //多于兩個元素
                mid = (low + high)/;
                //low、mid和high位置的元素都相同
                if(array[low] == array[high] && array[mid] == array[high]){
                    //順序查找
                    return orderSearch(array,low,high);
                }
                //如果中間位置的值大于array[low]的值,說明最小值在a[mid]的右邊
                if(array[mid] >= array[low]){
                    low = mid;
                }else if(array[mid] <= array[high]){
                    high = mid;
                }
            }
            return array[mid];
        }

        //順序查找
        private int orderSearch(int[] array, int low, int high) {
            int result = array[low];
            for(int i = low + ; i <= high;i++){
                if(result > array[i]){
                    result = array[i];
                }
            }
            return result;
        }
}
           

另一種方式:時間複雜度高一點

public class Solution {
    public int minNumberInRotateArray(int [] array) {
        if(array.length==){
            return ;
        }
        if(array.length == ){
            return array[];
        }
        for(int i = ;i < array.length-;i++){
            if(array[i]>array[i+]){
                return array[i+];
            }else{
                if(i == array.length-){
                    return array[];
                }

            }
        }
        return ;
    }
}