【劍指offer】數組——數組的旋轉

package cn.dzp.flyroc.offer;

public class ArrayRotateDemo {

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

    /*給出全部的元素都大於0,若數組大小爲0,請返回0*/

    /*思路:利用二分法,找到中間的數,而後和最左邊的值進行比較,
    若大於最左邊的數,則最左邊從mid開始,若小於最右邊的值,則最右邊從mid開始
    若左中右三值相等,則取mid先後值中較小的數*/

    public static int minNumberInRotateArray(int[] array) {

        int low = 0;        //定義最左邊的索引值            
        int high = array.length-1;      //定義最右邊的索引值

        int mid = 0;        //定義中間值

        while (low < high){     

            mid = (low + high)/2;       //定義中間值

            if (array[mid] > array[high]){      //若是中間值大於最後一個元素

                low = mid + 1;      //從右邊開始查找(最小的元素確定在右邊)

            }else if (array[mid] == array[high]){       //若是中間元素等於最右邊元素

                for (int i = 0; i < array.length-1; i++){       //沒法判斷,只能一個個查找
                    if (array[i] > array[i+1]){
                        int min = array[i+1];
                        array[i+1] = array[i];
                        array[i] = min;
                        System.out.println("這是最小的元素:"+min);
                        return min;
                    }
                }

            }else {     //若是中間元素小於最右邊元素(最小元素確定在左邊)

                high = mid - 1;     //從左邊開始查找

            }
        }
        System.out.println("這是最小的元素:"+array[low]);
        return array[mid];
    }

    public static void main(String[] args){

        int[] array = {3,4,5,1,2};

        minNumberInRotateArray(array);
    }
}
相關文章
相關標籤/搜索