題目:
輸入一個按遞增排序數組的一個旋轉,輸出該數組的最小數字。
輸入:
12345的旋轉可以是34512,所以我們輸入34512.
輸出:
1
解題思路:
較爲直觀的方法是每一個數據都掃描一遍,找到最小的元素,這樣的時間複雜度爲0(N),但是可以 利用2分法,用兩個指針分別指向數組的第一個元素和最後一個元素,接着我們找到指針之間的中間元素,通過判斷中間元素是大於第一個指針來判斷是在第一個數組之中,還是在第二個數組之中,然後不斷的縮小範圍,當兩個指針相差爲1時,第二個指針,恰好指向最小元素。當然也有例外情況,比如(1,0,1,1,1)是(0,1,1,1,1,1)的旋轉,他們的中間元素和第一個指針與第二個指針都相同,這樣我們很難判斷他是第一個數組還是第二個數組,這種情況下,我們只能採用順序查找。
Java代碼實現:
/**
* @param args
*/
public static void main(String[] args) {
int[] arr={3,4,5,1,2};
// TODO Auto-generated method stub
System.out.println(min(arr));
}
//輸出旋轉數組的最小元素
public static int min(int arr[]){
int index1=0;
int index2=arr.length-1;
int mid=index1;
if(arr==null && arr.length<=0){
return 0;
}
while(arr[index1]>=arr[index2]){
if(arr[index1]==arr[index2] && arr[mid]==arr[index1])
{
int min=arr[index1];
for(int i=index1+1;i<=index2;i++){
if(arr[i]<min){
min=arr[i];
}
return min;
}
}
if(index2-index1==1){
mid=index2;
break;
}
//用位運算代替除法,可以節省效率
mid=(index1+index2)>>1;
if(arr[mid]>=arr[index1]){
index1=mid;
}else if(arr[mid]<=arr[index2]){
index2=mid;
}
}
return arr[mid];
}