排序陣列的查詢問題首先考慮使用 二分法 解決。
流程:
當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.思路 設定兩個指標。利用二分查詢法。第乙個指標指向第乙個元素,第二個指向最後乙個元素。找到陣列的中間元素,如果中間的元素大於第乙...