旋轉陣列是指在原有順序陣列基礎上,以某個未知點進行了旋轉。以公升序陣列為例,其旋轉後有三種基本形態(見下圖,圖中虛線為陣列中心位置):
情況一:未旋轉
情況二:旋轉點位於中心位置右側
情況三:旋轉點位於中心位置左側。
利用二分法可以以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...