劍指offer_陣列---旋轉陣列的最小數字
阿新 • • 發佈:2019-01-05
題目描述
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。
解題思路
1,使用Arrays.sort
2,暴力遍歷法
3,二分查詢
程式碼實現
package 陣列;
import java.util.Arrays;
public class MinNumberInRotateArray {
public static void main(String[] args) {
int [] array = { 1,1,1,0,1 };
System.out.println(new MinNumberInRotateArray()
.minNumberInRotateArraySuperFind(array));
}
// =========================================================非技巧解法利用Arrays的sort函式,直接排序O(nlogn)
public int minNumberInRotateArray(int[] array) {
if (array==null||array.length<1){
throw new RuntimeException("陣列不合法");
}
Arrays.sort(array);
return array[0];
}
// ==========================================================技巧解法,暴力遍歷法O(n)
public int minNumberInRotateArraySuper(int[] array) {
if(array ==null||array.length<1){
throw new RuntimeException("陣列不合法");
}
int i = 0;
for (; i < array.length; i++) {
if (array[i] > array[i + 1]) {
break;
}
}
return array[i + 1];
}
// ==========================================================技巧解法,二分查詢法O(logn)
public int minNumberInRotateArraySuperFind(int[] array) {
if(array==null||array.length<1){
throw new RuntimeException("陣列不合法");
}
int low = 0;
int high = array.length-1;
int middle =0;
while(low<high){
middle = (high+low)/2;
if(array[middle]>array[high]){ //middle在左邊遞增區間
low = middle+1; //最小值在middle右邊
}else if(array[middle]==array[high]){ //1,1,1,0,1這樣沒有辦法只能順序遍歷
Arrays.sort(array);
return array[0];
}
else{
high = middle; //middle在右邊遞增區間,最小值在middle或者middle左邊
}
}
return array[low];
}
}