1. 程式人生 > >《劍指offer》系列 旋轉陣列的最小數字(Java)

《劍指offer》系列 旋轉陣列的最小數字(Java)

連結

題目描述

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

思路

找到最小數字通常只需遍歷一遍陣列就可以,時間複雜度是O(n)。
這裡肯定不能這樣做,因為沒有利用到旋轉陣列的特性,根據觀察,最小值其實是陣列前後兩部分的分界,而這兩部分都是有序的,可以利用二分查詢的思想進行處理。

程式碼

import java.util.ArrayList;
public class Solution {
    public int minNumberInRotateArray(int[] array) {
        if (array.length == 0) {
            return 0;
        }
        int low = 0;
        int high = array.length - 1;
        int mid = low;
        while (array[low] >= array[high]) {
            if (high - low == 1) {          //左邊比右邊下標為1 時候 找到目標值
                mid = high;
                break;
            }
            mid = (low + high) / 2;
            if (array[mid] >= array[low]) {     //當中間值比左邊值大的時候 說明最小值還在後面
                low = mid;
            } else if (array[mid] <= array[high]) {     //當中間值比左邊值小的時候 說明最小值在前面
                high = mid;
            }
        }
        return array[mid];
    }
}