二分-

二分初學總聽到說簡單的話。
說簡單的話就真的是我學得少,二分其實是很巧妙的,很深的,還有很多需要我去學。
這次周賽裏有一道二分題目,可憐我當時並沒有考慮清楚這個道題目的二分。所以還是太菜了,(留下不爭氣的眼淚 jiayouba

還是來理解一下二分:
二分是建立在有單調性纔會去使用的。
簡單舉個例子:用二分找一個數
每次拿出序列中間的數並和目標數字進行比較,會有三種情況:
1.這個數恰好等於目標數字,找到了,返回這個數的下標index。
2.這個數比目標小說明目標在右半邊的序列中,淘汰掉左半邊。
3.這個數比目標大說明目標在左半邊的序列中,淘汰掉右半邊。
當出現2、3這兩種情況時,我們就在對應的半邊序列中遞歸地重複上述判斷,直到這半邊的序列爲空位止,這時就說明序列中並沒有對應的數字,直接返回當前的index。

ll erfen(ll x,ll da)
{
    ll l=1,r=x;
    while(l<=r)
    {
        ll mid=(l+r)>>1;
        if(num[mid]==da)
        {
            return mid;
        }
        else if(num[mid]>da)
            r=mid-1;
        else
            l=mid+1;
    }
    return l;
}

寫這個二分還要考慮一些細節:
比如
1.爲什麼while(l<=r)而不是l<r,這時候就用極端去考慮,因爲序列裏只有一個1時,l=r=1,那麼就會進不了while。
2爲什麼不相等後 r 和 l 的值不是賦值成 mid,或者其它,而是要 -1 和 +1 呢?如果不相等,說明無輪如何 nums[mid] 都不應該被包含進下一輪的判斷,所以才通過 -1 和 +1 來將其砍掉。

當然二分還有其它變種以及函數和許多不同題目不同用法,所以,我希望下一階段要深學這一個方面的知識點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章