把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。
輸入乙個非遞減排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。
例如陣列為的乙個旋轉,該陣列的最小值為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...