採用二分法的思想
-
採用二分法,主要是mid與一個target比較,普通的二分查找target是給出來的,但有時沒有明確的target,比如這道題,這時一般選擇端點當作target,即
l
或r
。 -
端點的選擇問題:對與這道題,應該選擇
r
,如圖所示,傾斜的實線代表序列上升的趨勢。
-
選擇
r
:當mid>r時,顯然尋找的min在mid右邊。所以區間放縮:
l=mid+1
。當mid<r時,min可能在mid的左邊,但min也可能就是mid(因爲min也小於r),所以區間放縮爲:
r=mid
。當mid=r時,注意到序列非減,即存在mid到r全部相等的情況,這時min應在mid左邊,也或者min=mid=……=r。所以這裏也放縮爲
r = mid
。 -
選擇
l
:事實上,選擇
l
時走不通的,我剛開始就是選擇的l
,然後寫的心力憔悴也過不了。還是如上圖所示:當mid>l時,特殊情況下,min在mid左邊, 一般情況下 min 在mid右邊,這就導致在進行放縮時無法採用相同的策略,也就無法簡單的使用循環二分來解題了。
-
代碼:
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0)return 0;
int l=0,r=array.length-1;
while(l<r){
int mid = (l+r)>>1;
if(array[mid]<=array[r])r=mid;
else l=mid+1;
}
return array[l];
}
}