【題目】
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列[0,1,2,4,5,6,7]
可能變為[4,5,6,7,0,1,2]
)。
搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回-1
。
你可以假設陣列中不存在重複的元素。
你的演算法時間複雜度必須是 o(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2]示例 2:, target = 0
輸出: 4
輸入: nums = [4,5,6,7,0,1,2]【分析過程】, target = 3
輸出: -1
以題目中給的陣列[4,5,6,7,0,1,2]為例,我首先想到的是二分查詢,但是之前學習的二分查詢的前提是有序陣列,所以這道題不能直接套用二分查詢的**,但是可以套用二分查詢的思想。
查詢目標值target是否在陣列[4,5,6,7,0,1,2]中有以下幾種情況:
nums[mid] == target,那麼我們返回mid即可
如果陣列中mid左邊為遞增數列,也就是從nums[left]到nums[mid]遞增,那麼又可以分為兩種情況:
1. target在mums[left]和nums[mid]之間 ——我們就只需要到這個區間中尋找
2.target不在之間,也就是在另外乙個區間中
如果陣列中mid右邊為遞增數列,也就是從nums[mid]到nums[right]遞增,那麼又可以分為兩種情況:
1. target在mums[mid]和nums[right]之間
2.target不在之間,也就是在另外乙個區間中
這個方法很好理解,但是要注意邊界條件的判斷
【效能分析】
時間複雜度:
空間複雜度:
【python**】
class solution:
def search(self, nums: list, target: int) -> int:
if len(nums) == 0:
return -1
if len(nums) == 1:
return 0 if nums[0] == target else -1
left = 0
right = len(nums) - 1
while left < right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
elif nums[mid] < nums[right]:
if nums[mid] < target <= nums[right]:
left = mid + 1
else:
right = mid - 1
else:
if nums[left] <= target < nums[mid]:
right = mid - 1
else:
left = mid + 1
return left if nums[left] == target else -1
s = solution()
nums = [4,5,6,7,0,1,2]
target = 3
print(s.search(nums,target))
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 你可以假設陣列中不存在重複的元素。你的演算法時...