題目:把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。 輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該數組的最小值為1。 NOTE:給出的所有元素都大于0,若數組大小為0,請返回0。
代碼(暴力求解)
public class Solution {
public int minNumberInRotateArray(int [] array) {
for(int i = 1; i < array.length; i++){
if(array[i]< array[i-1]){
return array[i];
}
}
return 0;
}
}
二分查找
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int low = 0;
int high = array.length- 1;
int mid = 0;
while(low < high){
mid = low + (high - low)/2;
if(array[high] < array[mid]){
low = mid + 1;
}else if(array[high] > array[mid]){
high = mid;
}else{
high = high -1;
}
}
return array[low];
}
}
使用二分查找的話,思想與正常的二分查找類似,通過low,high,mid三個指針,不斷的通過low,和high兩個指針向mid上靠攏,并同時更新mid,來不斷的縮小查找范圍。不同的問題主要就是比較條件的不同。
在這個題目中是根據high和mid指針所對應的數值的比較來判斷如何更新high和low兩個指針的。
用high,low,mid來分別帶別數組中對應的指針。
具體如下
- 當mid >high 時說明,最小的數在mid后面的部分,所以要將mid及mid前面的數過濾掉,將low指針更新到mid的下一位。
- mid < high時說明,從mid到high是遞增的,即mid后面的數都大于mid所以,更新high=low,即將mid后面的數過濾掉(不包括mid)。
- mid = high時,后面的數都是與mid相等的,我最開始的時候想將這一中情況與mid < high的情況放到一起,直接將讓high = mid。 雖然牛客的測試用例通過了,但是看到評論里有人說
出現這種情況的array類似 [1,0,1,1,1] 或者[1,1,1,0,1],此時最小數字不好判斷在mid左邊
還是右邊,這時只好一個一個試 ,
high = high - 1
如果發生這種情況,正確的返回結果應該0,但是第二種此時mid是1,high也是以1,將high = mid,直接將0給過濾掉了,最終返回的是1,所以需要加一個判斷。