leetcode 33 搜尋旋轉排序陣列

2021-10-01 13:10:22 字數 1836 閱讀 7498

【題目】

假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列[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]

, target = 0

輸出: 4

示例 2:

輸入: 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 你可以假設陣列中不存在重複的元素。你的演算法時...