二分查詢法查詢旋轉陣列的最小值(Python)

2021-10-03 05:33:21 字數 2679 閱讀 7484

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。

輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。

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

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

例:非遞減排序陣列為1,2,3,4,5

輸入的旋轉陣列為3,4,5,1,2

二分查詢法適用於資料量較大,且提前排好序的資料,t(n)=o(log2n)

演算法描述

1   2   3   4   5   6   7   8   9   10
若查詢的陣列元素target = 8:

1.設定left = 1,right = 10,middle = 5

middle的取值為(left+right)/2之後向下取整

2.若middle > target,則right = middle-1

若middle < target,則left = middle+1

3.逐次迴圈,迴圈邊界為left <= right,若出現middle = target則查詢成功,不然查詢失敗

示例**

def

bsearch

(array,target)

: left=

0 right=

len(array)-1

while left <= right :

#除法沒有移位的快

# mid = (left + right)//2

# 101 = 5 => 10 = 2

#1100 = 12 => 110 = 6

#一下用了 向右 移一位, 那麼上面是解釋,它就相當於 除以2 。

mid =

(left + right)

>>

1#如果中間的數等於我們要找的數,那麼就返回。

if array[mid]

== target:

return mid

#如果說中間的數 < 目標的數,那麼就說明,我們要找的數在右側,所以左側取值的索引需要改變為中間的索引+1;

elif array[mid]

< target:

left = mid +

1#如果說中間的數 > 目標的數,那麼就說明,我們要找的數在左側,所以左側取值的索引需要改變為中間的索引-1; 因為越往左索引值越小

else

: right = mid-

1return none

if __name__ ==

'__main__'

: ret = bsearch([1

,2,3

,4,5

,6,7

,8,9

,10],

1)print

(ret)

演算法描述

1.通過觀察可知輸入陣列中的最小數值為1,任意乙個輸入的旋轉陣列的最小值都有乙個特點,即比前乙個數小且比後個數大

2.在利用二分查詢法查詢時,若right < middle,則意味著右側資料違背了元素遞增的規律,即最小值一定在middle往後的資料中,即left = middle+1

3.若right > middle,則意味著middle之後的資料是遞增規律,則最小值一定在middle的前面,即right = middle-1

示例**

class

solution

:def

minnumberinrotatearray

(self, rotatearray)

:#最小值 一定比前面的要小

# 二分法查詢資料 找左右的方法是:

#右邊的值大於中值,就說明最小值在左邊

ifnot rotatearray:

return

0 left =

0 right =

len(rotatearray)-1

while left <= right:

mid =

(left + right)

>>

1#如果說中間的數的上乙個數 > 中間數,那麼就說明,我們要找的數就是這個中間的數,返回這個數。

if rotatearray[mid -1]

> rotatearray[mid]

:return rotatearray[mid]

#如果說中間的數 < 中間數的上乙個數,那麼就說明,我們要找的數在二分法的左側,所以右側取值的索引需要改變為中間的索引-1;因為越往左索引值越小

elif rotatearray[mid]

< rotatearray[right]

: right = mid -

1#否則就說明,我們要找的數在二分法的右側,所以左側取值的索引需要改變為中間的索引+1;因為越往右索引值越小

else

: left = mid +

1return

0#**缺少輸入輸出

用右移1位比除以2更

查詢旋轉陣列最小值

求對於長度為n的陣列a,求子陣列的和接近0的子陣列。例如 定義n長度的空間sum 0 n 1 sum i 是a的前i項和。並且有sum i 1 sum i a i 1 首先對sum i 進行排序,找到求和最接近的2個值。同時記錄使得值最小的陣列最短的那一組。如圖 通過求取求和值最接近的一組資料可以找...

查詢旋轉陣列的最小值

旋轉後的陣列變成兩個有序陣列,最小值為兩個陣列的的分界線,前面子陣列的值都大於後面子陣列的值 用索引left right分別指向首尾元素 若陣列是普通公升序陣列,則left 若陣列是迴圈公升序陣列,則left right 計算mid,若mid 若mid right,則,後半段是迴圈公升序陣列 直到找...

旋轉陣列的最小值 二分思想

題目 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如陣列的乙個旋轉,該陣列的最小值為 1。package arraytest 反轉陣列查詢最小值,利用的是二分查詢的思想 author duola public class...