offer 11 旋轉數組的最小數字

旋轉數組的最小數字

image.png
實際在考察二分查找的方法算法

知識點

一個不包含重複元素的升序數組在通過旋轉以後,能夠獲得下面可視化的折線圖:
image.png數組

  • 通過旋轉,最小值右側的數必定嚴格小於最小值左側的數
  • 數組最後一個數爲x,則在數組最小值右側的數必定嚴格小於x,在數組最小值左側的數必定嚴格大於x,前提是不包括重複元素,所以利用這個尋找數組最右側的值,來用二分法解題
  • 定義左邊界爲left,右邊界爲right區間的中點爲pivot,最小值確定就在區間內,利用區間的中點值和右側邊界值進行比較,
  • 比右邊界值則說明區間的中點值在最小值的右側,所以咱們能夠忽略二分查找區間的右半部分
    image.png
  • 比右邊界值則說明區間的中點值在最小值的左側,所以咱們能夠忽略二分查找區間的左半部分
    image.png
    因爲數組不包含重複元素,而且只要當前的區間長度不爲 11,\it pivotpivot 就不會與 \it highhigh 重合;而若是當前的區間長度爲 11,這說明咱們已經能夠結束二分查找了。所以不會存在 nums[pivot]=nums[right] 的狀況。

題解

image.png
本題是沒有重複元素的因此沒有考慮元素相同的時候
image.png
return left和right均可以spa

元素重複的數組

image.png
本題裏面有重複元素,因此得考慮left和right的值相同的時候
image.png索引

  • 當中間節點和右邊界點的值相同的時候,沒法判斷最小值在中間節點的左側仍是右側,也就沒法判斷改變左邊界值仍是右邊界值,所以不能隨便忽略某一段元素,咱們只能肯定不管右邊界點的值是否是最小值,數組中都有一個和他相同的中間節點值,所以就能夠忽略右邊界點的值,而後對右邊界點往左側移動一個索引,也就是right--,若是仍是和中間節點值同樣就繼續right--,重複直到右邊界點right節點的值和中間節點的值不相同
    image.png
    image.png資源

    題解

    image.png
    return left和right均可以
    可是上面這樣right--至關於把相同的元素所有遍歷了一遍,若是重複元素不少,那就須要遍歷不少遍,耗資源it

    對上面算法進行改進

    image.png
    找到兩個相等以後就直接在裏面遍歷,不出循環了class

    劍指題目解答

    image.png
    image.png

相關文章
相關標籤/搜索