劍指offer 6 旋轉數組的最小數字

採用二分法的思想

  • 採用二分法,主要是mid與一個target比較,普通的二分查找target是給出來的,但有時沒有明確的target,比如這道題,這時一般選擇端點當作target,即lr

  • 端點的選擇問題:對與這道題,應該選擇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];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章