把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 [3,4,5,1,2] 為 [1,2,3,4,5] 的乙個旋轉,該陣列的最小值為1。
輸入:[3,4,5,1,2]
輸出:1
輸入:[2,2,2,0,1]
輸出:0
//注意可以不進行旋轉。若干個可以代表零。
輸入:[1,3,5]
輸出:1
遞增陣列,說明有相同元素
注意迴圈二分: 設 m = (i + j) / 2 為每次二分的中點,可分為以下三種情況:
當 nums[m] > nums[j] 時: m 一定在 左排序陣列 中,即旋轉點 x 一定在 [m + 1, j] 閉區間內,因此執行i = m + 1;
當 nums[m] < nums[j]時: m 一定在 右排序陣列 中,即旋轉點 x 一定在[i, m] 閉區間內,因此執行 j = m;
當 nums[m] = nums[j] 時: 無法判斷 m 在哪個排序陣列中,即無法判斷旋轉點 x 在 [i, m] 還是 [m + 1, j] 區間中。解決方案: 執行 j = j - 1 縮小判斷範圍,
二分目的是判斷 m 在哪個排序陣列中,從而縮小區間。而在 nums[m] > nums[i]情況下,無法判斷 m 在哪個排序陣列中。本質上是由於 j 初始值肯定在右排序陣列中(因為初始陣列單調遞增); i 初始值無法確定在哪個排序陣列中。舉例如下:
對於以下兩示例,當 i = 0, j = 4, m = 2 時,有 nums[m] > nums[i] ,而結果不同。
[1, 2, 3, 4 ,5] 旋轉點 x = 0 : m 在右排序陣列(此示例只有右排序陣列);
[3, 4, 5, 1 ,2] 旋轉點 x = 3 : m 在左排序陣列。
class
solution
return numbers[i];}
}
劍指offer 11旋轉陣列中最小的數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。第一種方法 從頭開始遍歷,當遇到不滿足非遞減排序規律的那個數時,那就是旋...
劍指offer11 旋轉陣列的最小數字
把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個公升序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。陣列可能包含重複項。注意 陣列內所含元素非負,若陣列大小為0,請返回 1。樣例 輸入 nums 2,2,2,0,1 輸出 0思路 首先判...
劍指Offer 11 旋轉陣列的最小數字
題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序陣列的乙個旋轉,輸出旋轉陣列的最小元素,例如,陣列為的乙個旋轉,該陣列的最小值為1.思路 設定兩個指標。利用二分查詢法。第乙個指標指向第乙個元素,第二個指向最後乙個元素。找到陣列的中間元素,如果中間的元素大於第乙...