1. 程式人生 > >旋轉陣列的最小數字(改造二分法)

旋轉陣列的最小數字(改造二分法)

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

}

結果: