1. 程式人生 > 實用技巧 >劍指offer 11. 旋轉陣列中的最小數

劍指offer 11. 旋轉陣列中的最小數

把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個遞增排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如,陣列[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

解題:

class Solution {
    public int minArray(int[] numbers) {
        if(numbers.length == 0)
            return -1;
        if(numbers.length == 1)
            return numbers[0];
        if(numbers.length == 2)
            return numbers[0]<numbers[1]?numbers[0]:numbers[1];
        int low = 0, high = numbers.length-1;
        int mid = (low + high) / 2;
        while(low < high-1){
            // 前中後三個下標對應陣列元素相等,不能按照二分法找最小值,只能按順序查詢
            if(numbers[low] == numbers[mid] && numbers[mid] == numbers[high])
                return InOrder(numbers);
            //剩餘陣列範圍內已經按從小到大順序排好
            if(numbers[low] < numbers[high])
                return numbers[low];
            //中間陣列元素大於等於低位陣列元素:最小值在後半部分
            //中間陣列元素小於等於高位陣列元素:最小值在前半部分
            if(numbers[mid] >= numbers[low])
                low = mid;
            else
                high = mid;
            mid = (low + high) / 2;
        }
        return numbers[high];
    }
    public int InOrder(int[] numbers){
        int i=0;
        while(i<numbers.length-2){
            if(numbers[i] <= numbers[i+1])
                i++;
            else 
                break;
        }
        return numbers[i+1];
    }
}