陣列 旋轉陣列的搜尋問題

2021-10-07 04:40:08 字數 1723 閱讀 5134

旋轉陣列是指在原有順序陣列基礎上,以某個未知點進行了旋轉。以公升序陣列為例,其旋轉後有三種基本形態(見下圖,圖中虛線為陣列中心位置):

情況一:未旋轉

情況二:旋轉點位於中心位置右側

情況三:旋轉點位於中心位置左側。

利用二分法可以以o(l

ogn)

(o(logn)(

o(logn

)(的時間複雜度在旋轉陣列中進行搜尋。解決此類的問題,需要注意如下幾點:

(1)除情況1外,旋轉陣列以最高點為分割,左右兩側的部分從左到右都為公升序(原始陣列為公升序陣列);

(2)通過mid點與low點或high點的大小,來進行形態的分類討論;

(3)注意邊界條件。比如在二分法中,通過mid=(low+high)/2迭代終點時,若原陣列長度為2時,mid和low是重疊的,因此要注意mid-1的溢位。同時在不同問題中mid可能保持原指標,也可能需要±1.

下面以兩個例子來簡單介紹下旋轉陣列的搜尋問題。

【問題一】搜尋某值是否在旋轉陣列(公升序)中

def

findrotatearray

(array, num):if

not array:

return

0 lo, hi =0,

len(array)-1

while lo <= hi:

mid = lo +

(hi-lo)//2

if array[mid]

== num:

return mid

elif array[mid]

> array[lo]

:if array[lo]

<= num < array[mid]

: hi = mid -

1else

: lo = mid +

1else

:if array[mid]

< num <= array[hi]

: lo = mid +

1else

: hi = mid -

1return

-1

【問題二】尋找旋轉陣列(公升序)中的最小元素

def

minnumberinrotatearray

(rotatearray):if

not rotatearray:

return

0 lo, hi =0,

len(rotatearray)-1

while lo < hi:

mid = lo +

(hi - lo)//2

if rotatearray[mid]

> rotatearray[hi]

: lo = mid +

1elif rotatearray[mid]

== rotatearray[hi]

:# 注意mid可能和lo為同乙個數,所以應當和high對比

hi -=

1else

: hi = mid

return rotatearray[lo]

搜尋旋轉陣列

假設有乙個排序的按未知的旋轉軸旋轉的陣列 比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2 給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回 1。你可以假設陣列中不存在重複的元素。直接的方法是順序搜尋 更好的方法是二分搜尋 public class s...

33 搜尋旋轉陣列 python

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...

旋轉陣列問題求解

將包含 n 個元素的陣列向右旋轉 k 步。例如,如果 n 7 k 3,給定陣列 1,2,3,4,5,6,7 向右旋轉後的結果 5,6,7,1,2,3,4 可以每次將陣列中的元素右移一位,迴圈k次。由於向右旋轉位數k可能大於陣列元素個數n,所以通用的規律是 右移位數k k n。假設乙個陣列序列為abc...