1. 程式人生 > >新手算法學習之路----二分法Find Minimum in Rotated Sorted Array

新手算法學習之路----二分法Find Minimum in Rotated Sorted Array

有一個 序列 思路 pan ron write -1 需要 cnblogs

題目:假設一個旋轉排序的數組其起始位置是未知的(比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2)。

你需要找到其中最小的元素。

你可以假設數組中不存在重復的元素。

思路:首先排除三種極端情況,空,只有一個元素,以及整個數組都是順序排列的。

當順序的數組隨機旋轉排列後,就分為兩個順序列入題目中的4567和012,尋找到中間數來和數組最後一個元素對比,如果大於的話說明最小的數在中間數的右邊,如果小於的話說明最小數在中間數的左邊,然 後繼續按照二分法來找。註:不會出現中間數等於最後一個元素,因為題目中說明了沒有重復元素。

問題:我當時的思路是這兩個數組能不能被分成兩部分,兩個升序數組來求最小數,最後證明不對;由於思維被禁錮在二分法使用的前提是一個排好序的數組,結果更本沒有想到使用下邊的辦法,這個是我借鑒別人的偶,自己又簡化了一下。

public int findMin(int[] nums) {
        // write your code here
         if( nums == null || nums.length == 0)  //先排三種特殊的情況
            return 0;
        if(nums.length == 1)
            return nums[0];
        
int low = 0; int high = nums.length -1; int mid = low; while(low < high){ mid = (low + high)/2; if(nums[mid] > nums[high]){ //如果中間大於最後一個元素那說明最小的數在中間數的右邊 low = mid + 1; //數組的前一半排除掉 }else if( nums[mid] < nums[high]){ //
如果中間數小於最後一個元素,說明中間數後面部分的升序部分裏面,那最小說就在中間數左邊了 high = mid ; } } return nums[low];
}

新手算法學習之路----二分法Find Minimum in Rotated Sorted Array