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

2021-10-24 13:32:01 字數 1418 閱讀 1678

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 [3,4,5,1,2] 為 [1,2,3,4,5] 的乙個旋轉,該陣列的最小值為1。

關鍵點:

1.正常排序的情況下,最小就是第乙個;

2.旋轉過的,則找出第乙個數字小於前乙個數字。

從下標為0的元素開始遍歷;

每次進行比較,如果當前元素比相鄰的下一元素大,則對應的下乙個元素即為最小值;

如果遍歷到最後乙個元素都沒有出現過上述情況,則下標為0的元素為最小元素。

var

minarray

=function

(numbers)

return numbers[0];};

先排序,再輸出第乙個元素,就是最小的元素

題目中給出的是半有序陣列,雖然傳統二分告訴我們二分只能用在有序陣列中,但事實上,仍然可以使用二分思想。

思路:陣列中最特殊的位置是左邊位置 left 和右邊位置 right,將它們與中間位置 mid 的值進行比較,進而判斷最小數字出現在**。

用左邊位置 left 和中間位置 mid 的值進行比較是否可以?

舉例:[3, 4, 5, 1, 2] 與 [1, 2, 3, 4, 5] ,此時,中間位置的值都比左邊大,但最小值乙個在後面,乙個在前面,因此這種做法不能有效地減治。

用右邊位置 right 和中間位置 mid 的值進行比較是否可以?

舉例:[1, 2, 3, 4, 5]、[3, 4, 5, 1, 2]、[2, 3, 4, 5 ,1],用右邊位置和中間位置的元素比較,可以進一步縮小搜尋的範圍。

補充說明:遇到 nums[mid] == nums[right] 的時候,不能草率地下定結論最小數字在哪一邊,但是可以確定的是,把 right 捨棄掉,並不影響結果。

var

minarray

=function

(numbers)

else

if(numbers[mid]

)else

}return numbers[left];}

;

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

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。兩個注意的點 1.將前0個數字移動到後面的情況,即有序陣列,特殊處理。2...

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

題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉.輸入乙個非遞減排序的陣列 的乙個旋轉,輸出旋轉陣列的最小元素。note 給出的所有元素都大於0,若陣列大小為0,請返回0。測試用例 輸入 3,4,5,1,2 輸出 1思路分析 先判斷引數的合法性,也就是陣列是否為null或者...

劍指offer OJ,旋轉陣列的最小數字

時間限制 1秒空間限制 32768k 通過比例 15.05 最佳記錄 0 ms 8552k 來自 牛客841129號 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減序列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。思想 採用...