二分查詢解決最小值問題

2021-10-05 23:06:27 字數 2006 閱讀 4320

題目描述

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

例如陣列為的乙個旋轉,該陣列的最小值為1。

note:給出的所有元素都大於0,若陣列大小為0,請返回0

這樣理解起來就很簡單了

class

solution

:def

minnumberinrotatearray

(self, rotatearray)

:#首先判斷陣列是否為空

ifnot rotatearray:

return

0#獲取陣列長度

n =len(rotatearray)

left =

0#左索引

right = n -

1#右索引

while left <= right:

#當左索引大於右索引跳出迴圈

mid =

(left + right)//2

#找中間值

if rotatearray[mid]

< rotatearray[mid-1]

:#先判斷中值是否小於其左值

return rotatearray[mid]

elif rotatearray[mid]

< rotatearray[right]

:#中值小於右值,最小值在左

right = mid -

1#縮小右值範圍

else

: left = mid +

1#縮小左值範圍

return

0

test = solution(

)test.minnumberinrotatearray([3

,4,5

,6,1

,2])

1
有乙個題目和這個是一樣的,就是題目中的條件不同,這裡我把這兩道題放在一起對比一下。

題目描述

if __name__ ==

"__main__"

:list

=list

(map

(int

,input()

.strip(

).split())

)# low和high用於跟蹤要在其中查詢的列表部分

low =

0 high =

len(

list)-

1while low <= high:

# 只要範圍沒有縮小到只包含乙個元素,就檢查中間的元素

mid =

(low + high)//2

# 如果(low + high)不是偶數,python自動將mid向下取整

iflist

[mid]

>

list

[high]

:# 當中間元素大於最後乙個,表明最小值在右半區間

low = mid +

1elif

list

[mid]

<

list

[high]

:# 當中間元素小於最後乙個,表明最小值在左半區間,注意沒有減一操作

high = mid

else

:# 當中間元素等於最後乙個,說明沒有指定的元素,將範圍縮小一

high = high -

1print

(list

[mid]

)

輸入:

3 4 5 1 2

輸出:1

二分查詢迴圈最小值

典型的應用有 1 最常規問題 在有序陣列中查詢某個值。2 有序陣列中查詢某個值的所在範圍。3 在迴圈有序陣列中查詢某個值。4 在迴圈有序陣列中查詢陣列最小值 即迴圈偏移位置 二分查詢的主要步驟 一般都是根據左右邊界left和right來控制查詢範圍,取得中間位置a mid 依據mid位置的值來選擇下...

二分 最大的最小值

mad jim jaspers為了證明釹磁鐵的強大,拿來了乙個有n個小槽的長木條,m個釹磁鐵,第i個小槽在xi的位置上,為了不讓磁鐵互相吸引,每塊磁鐵離其他磁鐵的距離應該盡可能的大。請你幫mjj寫乙個程式,求出所有磁鐵之間最小距離的最大值。只要磁鐵距離大於等於1就不會互相吸引。輸入格式 第一行兩個數...

二分搜尋 區域性最小值位置

案例一 區域性值最小值位置 雖然是個無序陣列,但是由於任意兩個相鄰元素的值不重複的性質決定了可以使用二分搜尋演算法。思路 1.陣列為空或長度為0,返回 1,表示區域性值不存在 2.陣列長度為1,返回位置0 3.陣列長度大於1時 考慮三種情況 考慮最左邊和最右邊的元素 如果arr 0 考慮最中間元素,...