尋找旋轉陣列的最小值

2021-10-23 01:30:25 字數 2145 閱讀 1675

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

這道題的要求是尋找最小值,附加的條件是給出了兩個有序的陣列。

如果旋轉的數字個數大於0(可以為0),那麼最後乙個一定小於等於第乙個。有序的查詢一般都想到二分法,所以,如果mid小於min,說明mid屬於第二個遞增陣列;如果mid大於min,說明屬於第乙個陣列。如果等於,兩種情況都可能出現。([1,1,1,1,1,2,1]第乙個-----[1,2,1,1,1,1,1])。

所以第二種情況下利用二分法比較吃力,不能有效縮小範圍(也可以,但是證明比較麻煩)。

所以第一種方法先對當等於的時候使用順序遍歷的方法找最小值。

考慮特殊的情況就是只有乙個的時候,none的時候,等於的時候,沒有旋轉的時候。

class

solution

(object):

# 全面考慮

defminarray

(self, numbers):if

not numbers:

return

min=

0max

=len

(numbers)-1

while

min<

max:

mid =

(min

+max)//

2if numbers[mid]

> numbers[

max]

:min

= mid +

1elif numbers[mid]

< numbers[

max]

:max

= mid

elif numbers[mid]

== numbers[

max]

and numbers[mid]

> numbers[

min]

:return numbers[

min]

else

:# 剩下的就是三者相等的情況,這個時候無法使用mid 來縮小範圍,

#因為可能mid屬於前面的陣列(1 1 1 1 2 1)

#也可能屬於後面的陣列(1 2 1 1 1 1 ),所以索性直接順序查詢。

for i in

range

(min

,max):

if numbers[i+1]

< numbers[i]

:return numbers[i+1]

if i ==

max-1:

# 這個的作用是防止如[1,1]情況,就是無限的迴圈,因為min和max沒有改變。

return numbers[

min]

return numbers[

min]

# 如果只交換了0個,即排序遞增,最後min == max,在這裡輸出。

方法二:直接二分,不使用順序查詢

其他一樣,當min,mid,max三者對應的陣列的值相等的時候,max -= 1,這樣適用於兩種情況。如果是mid屬於後面的陣列,那麼max-1是對的,將後面的陣列縮小了乙個的範圍;如果屬於前面的,分兩種情況,將最小的那個數的序號記作 truth,如果nums[truth]class

solution

(object):

defminarray

(self, numbers):if

not numbers:

return

min=

0max

=len

(numbers)-1

while

min<

max:

mid =

(min

+max)//

2if numbers[mid]

> numbers[

max]

:min

= mid +

1elif numbers[mid]

< numbers[

max]

:max

= mid

else

:max-=1

return numbers[

min]

尋找旋轉陣列中的最小值

假設乙個旋轉排序的陣列其起始位置是未知的 比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2 你需要找到其中最小的元素。你可以假設陣列中不存在重複的元素。分析 尋找陣列中某一類特定的值,很容易聯想到二分法。本題中陣列是旋轉的,而且是排序的,還是比較有規律,可以分情況討論mid的落點...

旋轉陣列的最小值

題目 把乙個陣列的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小值。例如陣列為的乙個旋轉,該陣列的最小值為1。解析 1 我們可以用順序查詢的方法找到陣列中的最小值,但是這個方法沒有用到旋轉陣列區域性有序的特點。2 和二分查詢法一樣,我們用兩個指標...

旋轉陣列的最小值

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列為的乙個旋轉,該陣列的最小值為1。note 給出的所有元素都大於0,若陣列大小為0,請返回0。思路 類似二分查詢,不斷縮小查詢範圍 int minnumberinro...