153. 尋找旋轉(zhuǎn)排序數(shù)組中的最小值(二分套路)

https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/
這個(gè)題目,元素是unique的。難度并不高,二分細(xì)節(jié)難搞,沒關(guān)系,咱們記住套路。
154是個(gè)hard, 元素是可以重復(fù)的,先不做。先把這個(gè)題套路記住了。

分三種情況:
1) 1 2 3 4 5
無旋轉(zhuǎn),最小值在左,左<中<右,收縮右邊界。

  1. 4 5 1 2 3
    有旋轉(zhuǎn),最小值在左,左>中,中<右,收縮右邊界。(中可能是最?。?br> 3) 2 3 4 5 1
    有旋轉(zhuǎn),最小值在右,左<中,中>右,收縮左邊界。(中不可能是最?。?/li>

分析前面三種可能的情況,會(huì)發(fā)現(xiàn)情況1、2是一類,情況3是另一類。

如果中值 < 右值,則最小值在左半邊,可以收縮右邊界。
如果中值 > 右值,則最小值在右半邊,可以收縮左邊界。

class Solution {
public:
    int findMin(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        while (left < right) {
            int mid = left + (right - left) / 2; /* 地板除,mid更靠近left */
            if (nums[mid] < nums[right]) {
                right = mid; /* 因?yàn)橹兄?< 右值,中值也可能是最小值,右邊界只能取到mid處 */ 
            } else {
                left = mid + 1; /* 因?yàn)橹兄?> 右值,中值肯定不是最小值,左邊界可以跨過mid */
            }
        }
        return nums[left]; /* 循環(huán)結(jié)束,left == right,最小值輸出nums[left]或nums[right]均可 */   
    }
}

按照這個(gè)模板,記住就好!以上分析都是為了輔助記憶!

二分套路總結(jié):
https://leetcode-cn.com/problems/search-insert-position/solution/te-bie-hao-yong-de-er-fen-cha-fa-fa-mo-ban-python-/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容