劍指 Offer 11 旋轉陣列的最小數字

2021-10-20 20:57:48 字數 1018 閱讀 6844

排序陣列的查詢問題首先考慮使用 二分法 解決。

流程:

nums[mid] > nums[r]時: mid一定在 左排序陣列 中,即旋轉點 x 一定在[mid+1,r]閉區間內,因此執行l=mid+1

nums[mid] < nums[r]時: mid一定在 右排序陣列 中,即旋轉點 x 一定在[l,mid]閉區間內,因此執行r=mid

nums[mid] =nums[r]時: 無法判斷 mm 在哪個排序陣列中。解決方案: 執行r-1縮小判斷範圍。

這題要注意,套用平時的二分搜尋模板 r應該為mid-1,但是這裡是mid。

這是因為當nums[mid] < nums[r]時候,mid可能就是那個反轉點,所以不能省略掉mid這個元素,故而mid不能減1。但是如果nums[mid] > nums[r]那就可以肯定mid不是反轉元素,因為它居然比別人大。

這個也告訴了我,套模板一般沒錯,但是有時候還是要詳細考慮邊界問題。

class

solution

int mid = l +

(r - l)/2

;if(numbers[mid]

> numbers[r]

)// mid 一定在 右排序陣列 中

else

if(numbers[mid]

< numbers[r]

)// 無法判斷 mm 在哪個排序陣列中

else

if(numbers[mid]

== numbers[r])}

//返回反轉點,也就是最小值

return numbers[l];}

}

劍指offer 11旋轉陣列中最小的數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。第一種方法 從頭開始遍歷,當遇到不滿足非遞減排序規律的那個數時,那就是旋...

劍指offer11 旋轉陣列的最小數字

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。陣列可能包含重複項。注意 陣列內所含元素非負,若陣列大小為0,請返回 1。樣例 輸入 nums 2,2,2,0,1 輸出 0思路 首先判...

劍指Offer 11 旋轉陣列的最小數字

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序陣列的乙個旋轉,輸出旋轉陣列的最小元素,例如,陣列為的乙個旋轉,該陣列的最小值為1.思路 設定兩個指標。利用二分查詢法。第乙個指標指向第乙個元素,第二個指向最後乙個元素。找到陣列的中間元素,如果中間的元素大於第乙...