把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為1。
採用二分法來查詢
- 使用兩個指標分別指向陣列的第乙個元素和最後乙個元素(lo,hi)
- 中間元素(mid)>=前面的元素(lo) 說明前面遞增 mid=lo
- 中間元素(mid)<=後面的元素(lo) 說明後面遞增 mid=hi
- 兩隻指標距離是1,
表明第乙個指標指向第乙個遞增子陣列的末尾,
第二個指標指向第二個遞增子陣列的開頭,
第二個子陣列的第乙個數就是最小的陣列
因此hi就是我們查詢的結果
但是這裡面有一些陷阱:
1.如果陣列的全部元素都旋轉,即 旋轉後的陣列就是原陣列,則最小數字是第乙個數字
2.中間數字與首尾數字大小相等,如和,無法採用二分法,只能順序查詢。
public int min(int arr)
int lo = 0;
int hi = arr.length - 1;
int mid = lo;
//如果陣列的全部元素都旋轉,即 旋轉後的陣列就是原陣列
//此時第乙個數字就是最小的數字,可以直接返回,這也是mid初始值是lo的原因
while (arr[lo] >= arr[hi])
mid = (lo + hi) / 2;
//解決陷阱2
if (arr[lo] == arr[hi] && arr[hi] == arr[mid])
if (arr[mid] >= arr[lo]) else if (arr[mid] <= arr[hi])
} return arr[mid];
}private int mininorder(int arr, int lo, int hi)
} return result;
}
測試用例
public void test01() ;
int i = min02(ints);
system.out.println("test01:" + i);
}public void test02() ;
int i = min02(ints);
system.out.println("test02:" + i);
}
輸出
test01:1
test02:0
旋轉陣列最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列 為的乙個旋轉,該陣列的最小值為1。code int min int numbers,int length int low 0 int high length 1 in...
旋轉陣列最小數字
旋轉陣列最小數字 劍指offer 二分查詢 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。解題思路 題目要求找到最小元素,第一反應是排序,但陣列基本有序直接排序浪費效能。結合資料的特點前半部分遞增,後半部分遞減,...
旋轉陣列的最小數字
1.問題描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出該旋轉陣列的最小元素。例如陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1.來自 劍指offer 2.分析 首先我們可以看到原陣列為遞增排序的,並且以...