旋轉陣列的最小數字(改造二分法)
阿新 • • 發佈:2019-01-13
題目:把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入一個遞增排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。
思路:這兒題目說了陣列是有序的,為了提升效率,可以用二分查詢去做,題目上也說了用二分查詢去做。事實上,以後的題目,只要說了有序,基本都可以用效率更高的查詢,比如二分查詢。
程式碼:
public class 旋轉陣列的最小數字 { public static void main(String[] args) { // TODO Auto-generated method stub int []arr = {5,1,2,3,4}; System.out.println("最小數字為"+min(arr)); } /** * 活用二分查詢 * @param arr * @return */ static int min(int arr[]){ int begin = 0; int end = arr.length - 1; // 考慮沒有旋轉這種特殊的旋轉 if (arr[begin] < arr[end]) return arr[begin]; while(begin+1<end){ int mid = begin + ((end-begin)>>1); // 要麼左側有序,要麼右側有序 // 下面這行程式碼有個bug 假如陣列為 1 1 1 0 1 這種陣列應該在程式的入口檢測一下 // 假如左側和中間相等了 那麼就應該用順序查詢最小值了。 if (arr[mid] >= arr[begin]) { // 左側有序 begin = mid; }else { end = mid; } } return arr[end]; } }
結果: