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

2022-01-29 20:13:54 字數 1397 閱讀 6175

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

輸入:[3,4,5,1,2]

輸出:1輸入:[2,2,2,0,1]

輸出:0

初始化變數ans為int_max,for迴圈掃瞄一遍輸入的陣列並迭代更行ans的值(當陣列中元素的值小於ans,則更新ans的值),時間複雜度o(n)

該陣列有個特性,可以看成是由乙個有序序列拆分成倆個部分的有序數列,所以比較連續兩個元素的大小即可。

普通的二分查詢演算法都是在有序陣列中尋找是否出現每個值,在本題中,陣列不在完全有序且題目並沒有給我們乙個需要尋找的值。

題目提供的陣列部分有序,且我們只需要比較numbers[mid]、numbers[l]、numbers[r]這三個元素的大小即可,所以我們依舊可以使用二分查詢演算法,把時間複雜度從o(n)將為o(logn)

偽**如下:

為什麼更新r值的時候不需要+1,而l值需要呢?

題目要找的是最小值,所以當numbers[mid] < numbers[l]的時候,numbers[mid]很可能是我們所要尋找的答案,而當numbers[mid] > numbers[r],因為numbers[r]的值已經小於numbers[mid],所以numbers[mid]不可能是我們要找的答案,所以需要更新l的值為mid + 1。

如果出現numbers[mid] == numbers[l] == numbers[r] == value的時候該怎麼辦?例如numbers = [3,3,1,3]、numbers = [1, 1, 1, 2, 3, 1]

無論value值是否是我們所需要的最小值,我們都可以把它刪除,因為一共有3個value值,刪除最右邊的乙個value元素不會造成影響。

暴力列舉

class

solution

return

ans;}}

雙指標

class

solution

return numbers[0];}}

二分查詢

class

solution

else

if(numbers[mid] >numbers[r])

else

if(numbers[mid] ==numbers[r])

else

}return

numbers[l];}}

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

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

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

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

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

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