新手算法學習之路----二分法Find Minimum in Rotated Sorted Array
阿新 • • 發佈:2017-07-06
有一個 序列 思路 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