題目時間複雜度要求是o(logn)級,所以得用二分查詢來做。原有序陣列經過旋轉,雖然整個陣列已經是無序的了,但是在最大值或最小值前後兩部分的資料依然是有序的,比如[0,1,2,4,5,6,7]旋轉變成[4,5,6,7,0,1,2],7前後兩部分依然有序,可以二分查詢。
所以最直接的想法就是找到經過旋轉後的最大值或最小值的索引,然後判斷要找的目標target位於哪個區間,這個問題就變成了在乙個簡單的在有序陣列中用二分查詢尋找乙個給定的值。
所以這個題就可以分成兩部分:1、用二分查詢找到最大值或最小值的索引,時間複雜度o(logn);2、有序陣列中用二分法找到目標值,時間複雜度o(logn)。總的時間複雜度這兩部分相加,整體還是對數級的時間複雜度,符合題目的要求。這種思路簡單直接,容易想到。下圖是執行時間。
:#利用二分查詢,找到最大值的索引,時間複雜度o(logn)
mid =
(start + end)//2
if nums[mid]
== max:
return mid
elif nums[mid]
> max:
return find_max(nums, mid+
1, end, nums[mid]
)else
:return find_max(nums, start, mid-
1, max)
max_index = find_max(nums,
1, n-
1, nums[0]
)if max_index == n-
1or target >= nums[0]
:#如果最大值在最後乙個,即陣列沒有發生旋轉
start, end =
0, max_index
else
: start, end = max_index+
1, n-
1def
find
(nums, start, end, target)
:#簡單的二分查詢尋找給定值的元素,時間複雜度o(logn)
if start > end:
return-1
mid =
(start + end)//2
if nums[mid]
== target:
return mid
elif nums[mid]
> target:
return find(nums, start, mid-
1, target)
else
:return find(nums, mid+
1, end, target)
return find(nums, start, end, target)
#總的時間複雜度o(2logn),為o(logn)級
leetcode33 搜尋旋轉排列陣列
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...
LeetCode 33 搜尋旋轉排序陣列
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1。你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...
leetcode 33 搜尋旋轉排序陣列
leetcode 33.搜尋旋轉排序陣列 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時...