Leetcode演算法 33 查詢有序旋轉陣列

2021-08-31 00:20:23 字數 1774 閱讀 5017

給定乙個陣列,這個陣列是由乙個公升序陣列進行左旋或右旋若干次得到的。

比如,[0,1,2,4,5,6,7] 可能會變為 [4,5,6,7,0,1,2]

給定乙個目標值,去陣列中查詢這個值。如果找到,則返回索引,否則返回-1。

可以假設陣列中沒有重複值。

示例:example 1:

input: nums = [4,5,6,7,0,1,2], target = 0

output: 4

example 2:

input: nums = [4,5,6,7,0,1,2], target = 3

output: -1

如果沒有旋轉,就是有序陣列,那麼查詢乙個元素的位置有乙個經典的方法——二分法。

本題對有序陣列進行了旋轉,因此二分法也需要做出一些調整,主要體現在選擇左半區域還是右半區域作為下一次查詢的子串。

對於經典的二分法,如果目標值小於中位數,則下一次查詢選擇左半區域,否則,選擇右半區域。

對於本題,以圖為例,陣列首元素的索引為 l,尾元素的索引為 u,中位數的索引為 mid。由於旋轉而得到的,因此可以看到有乙個低谷,是最高值和最低值相鄰的地方。

演算法復的時間複雜度與經典二分法相同,為 o(logn)。

def

search

(nums, target)

:"""

:type nums: list[int]

:type target: int

:rtype: int

二分法。

"""ifnot nums:

return-1

l, u =0,

len(nums)-1

while

(l <= u)

:# 長度為1或2

if u - l <=1:

try:

return l + nums[l:u+1]

.index(target)

except

:return-1

mid =

int(

(l + u)/2

)if nums[mid]

== target:

return mid

if nums[mid]

> nums[l]

:# 說明mid落在了左半部分

if target > nums[mid]

: l = mid +

1elif target >= nums[l]

: u = mid-

1else

: l = mid +

1else

:if target < nums[mid]

: u = mid -

1elif target <= nums[u]

: l = mid +

1else

: u = mid -1if

'__main__'

== __name__:

nums =[4

,5,6

,7,0

,1,2

] target =

0print

(search(nums, target)

)

《演算法》 3 3平衡查詢樹(1)

理想情況下如何保持二叉樹的平衡?這裡引入平衡查詢樹。2 3查詢樹定義 2 節點,含有乙個鍵 及其對應值 和兩條鏈結,左鏈結指向的節點的鍵小於該節點,右鏈結指向的節點的鍵大於該節點 3 節點,含有兩個鍵 及其對應值 和三條鏈結,左鏈結指向的節點的鍵都小於該節點,中鏈結指向的節點的鍵介於節點的兩個鍵之間...

《演算法》 3 3平衡查詢樹(2)

2 3查詢樹的實現採用紅黑二叉樹的簡單資料結構來表達 用這樣的資料結構表達,量不大 3.3.1.1 紅黑二叉樹表達2 3查詢樹 由一條紅色左鏈結相連的裡那個2 節點表示乙個3 節點 黑鏈結是2 3樹中的普通鏈結 沒有任何乙個節點同時和兩條紅鏈結相連 紅鏈結均為左鏈結 該樹是完美黑色平衡樹,即任意空連...

leetcode演算法練習 33 搜尋旋轉排序陣列

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