給定乙個陣列,這個陣列是由乙個公升序陣列進行左旋或右旋若干次得到的。
比如,[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 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是...